Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Server自联接(向下推列值)_Sql_Sql Server_Self Join - Fatal编程技术网

Sql Server自联接(向下推列值)

Sql Server自联接(向下推列值),sql,sql-server,self-join,Sql,Sql Server,Self Join,我被要求做以下工作: CycleStartDate需要是上一个BillDate记录中的BillDate。如果上一个记录不存在,则应使用DataTime表中最新的CycleEndDate CycleStartDate和CycleEndDate是名为DataTime的表中的列 BillDate是名为BillingData的表中的一列 这是BillDate值: 2012-07-27 00:00:00.000 2012-07-27 00:00:00.000 2012-08-27 00:00:00.000

我被要求做以下工作: CycleStartDate需要是上一个BillDate记录中的BillDate。如果上一个记录不存在,则应使用DataTime表中最新的CycleEndDate

CycleStartDate和CycleEndDate是名为DataTime的表中的列

BillDate是名为BillingData的表中的一列

这是BillDate值:

2012-07-27 00:00:00.000
2012-07-27 00:00:00.000
2012-08-27 00:00:00.000
2012-08-27 00:00:00.000
2012-09-28 00:00:00.000
2012-09-28 00:00:00.000
2012-10-26 00:00:00.000
2012-10-26 00:00:00.000
2012-11-27 00:00:00.000
2012-11-27 00:00:00.000
2012-12-27 00:00:00.000
如何根据需求设置CycleStartDate值?
Datetime表和BillingData表由一个名为MeterID的列连接。

尝试类似的方法

SELECT B.BillDate, 
       ISNULL(
              B2.BillDate, 
              (SELECT MAX(CycleEndDate) FROM DataTime DT WHERE DT.MeterID = B.MeterID)
             )  CycleStartDate 
    FROM BillingData B
    OUTER APPLY (
                 SELECT TOP 1 B2.BillDate 
                        FROM BillingData B2 
                        WHERE B2.MeterID = B.MeterID AND 
                              B2.BillingData < B.BillingData 
                        ORDER BY B2.BillingData DESC
                ) B2

我认为第二个版本是相当可读的。。。对于每一行BillingData B,查找小于当前BillDate的最大BillDate(
MAX(B2.BillDate)
)和相同的
MeterID
。如果不存在(
ISNULL
,如果第一个不存在,那么它就是
NULL
,因此它会转到
ISNULL
)的第二部分,从
DataTime
中查找具有相同
MeterID
的最大
CycleEndDate
,然后返回它。

您可以使用
行号()
用于偏移连接的函数
连接

SELECT a.BillDate, COALESCE(b.BillDate,c.CycleEndDate) 'CycleEndDate'
FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY MeterID ORDER BY BillDate DESC)'RowRank'
      FROM YourTable
     )a
LEFT JOIN (SELECT *,ROW_NUMBER() OVER (PARTITION BY MeterID ORDER BY BillDate DESC)'RowRank'
           FROM YourTable
           )b
      ON a.RowRank = b.RowRank - 1
      AND a.MeterID = b.MeterID
LEFT JOIN (SELECT MeterID,MAX(CycleEndDate)'CycleEndDate'
           FROM DataTime
           GROUP BY MeterID
          ) c
    ON a.MeterID = c.MeterID
划分可能没有必要,以及
联接
中的
MeterID
标准,您的措辞对于
排序是升序还是降序有点混淆,因为它位于最新记录之上,将是从日期时间表中获取其日期的记录,删除
DESC
,使其成为从该表中获取其值的最早记录

SELECT a.BillDate, COALESCE(b.BillDate,c.CycleEndDate) 'CycleEndDate'
FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY MeterID ORDER BY BillDate DESC)'RowRank'
      FROM YourTable
     )a
LEFT JOIN (SELECT *,ROW_NUMBER() OVER (PARTITION BY MeterID ORDER BY BillDate DESC)'RowRank'
           FROM YourTable
           )b
      ON a.RowRank = b.RowRank - 1
      AND a.MeterID = b.MeterID
LEFT JOIN (SELECT MeterID,MAX(CycleEndDate)'CycleEndDate'
           FROM DataTime
           GROUP BY MeterID
          ) c
    ON a.MeterID = c.MeterID