0

「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 という列で接続されています。

4

2 に答える 2

0

これに似たものを試してください...

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

SELECT MAX(CycleEndDate) FROM DataTime DT WHERE DT.MeterID = B.MeterIDまだ 1 つ疑問があります...またはを取る必要がありSELECT MAX(CycleEndDate) FROM DataTime DT WHERE DT.MeterID = B.MeterID AND DT.CycleEndDate < B.BillDateますか?

ただし、OUTER APPLYなしで実行できます...

SELECT B.BillDate, 
       ISNULL(
              (SELECT MAX(B2.BillDate) 
                      FROM BillingData B2 
                      WHERE B2.MeterID = B.MeterID AND 
                            B2.BillingData < B.BillingData),

              (SELECT MAX(CycleEndDate) FROM DataTime DT WHERE DT.MeterID = B.MeterID)
             )  CycleStartDate 
       FROM BillingData B

2 番目のバージョンはかなり読みやすいと思います... BillingData B の各行について、現在よりも小さく、同じである最大のBillDate( ) を探します。存在しない場合 ( 、最初のものが存在しない場合はであるため、 の 2 番目の部分に移動します)、同じで最大のものを探して返します。MAX(B2.BillDate)BillDateMeterIDISNULLNULLISNULLCycleEndDateDataTimeMeterID

于 2013-08-12T17:42:52.737 に答える
0

ROW_NUMBER()をオフセットする関数を使用できますJOIN

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

の基準PARTITION BYと同様に必要ではない場合があります。最新のレコードの上にあるため、昇順または降順のどちらにするかについて、あなたの言い回しは少し混乱しています。DateTimeテーブルから日付を取得するレコードです。そのテーブルから値を取得する最も古いレコードにします。MeterIDJOINORDER BYDESC

于 2013-08-12T17:57:31.090 に答える