如何从sql查询中获取先前的数据行?

时间:2020-06-07 10:23:26

标签: sql sql-server database select where-clause

现在我自定义查询以获取特定数据,我想从该数据中获取上一行数据

我尝试了此查询,但它得到了错误

SELECT  Data_date -(SELECT * FROM [x].[dbo].[JSON_SOURCE] WHERE Data_date <= (SELECT TOP(1) Data_Date
  FROM [x].[dbo].[JSON_SOURCE] 
  where ([Actual_cumulative] != null OR LTRIM(RTRIM([Actual_cumulative])) !='') 
  AND ([Early_Variance_monthly] != null OR LTRIM(RTRIM([Early_Variance_monthly])) !='' ) 
  AND ([Early_Variance_cumulative] != null OR LTRIM(RTRIM([Early_Variance_cumulative])) !='' ) 
  AND ([Late_Variance_monthly] != null OR LTRIM(RTRIM([Late_Variance_monthly])) !='' ) 
  AND ([Late_Variance_cumulative] != null OR LTRIM(RTRIM([Late_Variance_cumulative])) !='' ) 
  AND lower([Slug_Type]) IN('lg') ORDER BY Data_Date DESC) AND lower([Slug_Type]) IN('lg'))FROM [x].[dbo].[JSON_SOURCE]

此查询正在选择我想要的数据,从此查询结果中我想获取以前的数据是可能的吗?

SELECT * FROM [x].[dbo].[JSON_SOURCE] WHERE Data_date <= (SELECT TOP(1) Data_Date
  FROM [x].[dbo].[JSON_SOURCE] 
  where ([Actual_cumulative] != null OR LTRIM(RTRIM([Actual_cumulative])) !='') 
  AND ([Early_Variance_monthly] != null OR LTRIM(RTRIM([Early_Variance_monthly])) !='' ) 
  AND ([Early_Variance_cumulative] != null OR LTRIM(RTRIM([Early_Variance_cumulative])) !='' ) 
  AND ([Late_Variance_monthly] != null OR LTRIM(RTRIM([Late_Variance_monthly])) !='' ) 
  AND ([Late_Variance_cumulative] != null OR LTRIM(RTRIM([Late_Variance_cumulative])) !='' ) 
  AND lower([Slug_Type]) IN('lg') ORDER BY Data_Date DESC) AND lower([Slug_Type]) IN('lg')

1 个答案:

答案 0 :(得分:0)

因此,您想将表自身连接起来,并在表中选择相关行以将原始数据放在旁边。

为此,您可以对查询进行排序和分区,以便在每条记录的旁边放置一些符合WHERE子句的相关记录,然后使用分区的ORDER知道要选择哪一行。

我引入了ISNULL以消除WHERE中的某些复杂性。

看看这是如何工作的,您可能需要更改某些顺序或> = <=运算符。

Select *
FROM
(
    SELECT *, ROW_Number() over (partition by a.Id order by isnull(b.Data_Date,'1900-01-01') Desc) as RowOrder
    FROM [x].[dbo].[JSON_SOURCE] a
    left join [x].[dbo].[JSON_SOURCE] b
    ON a.Id != b.Id --Use whatever your Primary Key is to prevent selecting the same row as a secondary row.
    AND a.Data_date <= b.Data_date
    AND a.Slug_Type = b.Slug_Type
    WHERE
    LTRIM(RTRIM(ISNULL(b.[Actual_cumulative],''))) !=''
    AND LTRIM(RTRIM(ISNULL(b.[Early_Variance_monthly],''))) !='' 
    AND LTRIM(RTRIM(ISNULL(b.[Early_Variance_cumulative],''))) !='' 
    AND LTRIM(RTRIM(ISNULL(b.[Late_Variance_monthly],''))) !='' 
    AND LTRIM(RTRIM(ISNULL(b.[Late_Variance_cumulative],''))) !='' 
    AND lower(a.[Slug_Type]) IN('lg')
) cte
WHERE cte.RowOrder = 1
相关问题