後続の行の日付を条件付きで調整する方法

コリン

家の状態を報告する必要のあるシステムがあります。家は、「一次」要素に失敗した場合、または2つの二次要素を蓄積した場合に、住宅基準に失敗します。これは、Management Studioに貼り付けて実行できる例です。これには、私が達成しようとしていることを説明するコメントが付いています。

WITH T1 AS
( SELECT
    1 propertyid,
    'Principal roof covering' text,
    0 isprimary,
    CAST('1 Apr 2016' AS datetime) date,
    'This should not appear because it is secondary and 
    there are no subsequent secondary elements for this property' comment 
    UNION SELECT
    1,
    'Chimney stacks',
    0,
    CAST('1 Apr 2015' AS datetime),
    'This should appear unadjusted because it is secondary and there is a 
    preceding secondary element for the same property' UNION SELECT
    1,
    'Bathroom condition',
    1,
    CAST('1 Apr 2014' AS datetime),
    'This should appear unadjusted because it is primary' UNION SELECT
    2,
    'Damp proof course',
    0,
    CAST('1 Apr 2016' AS datetime),
    'This should not appear because it is secondary and there are no
    subsequent secondary elements for this property' 
    UNION SELECT
    1,
    'External wall finish',
    0,
    CAST('1 Apr 2014' AS datetime),
    'This should get it''s date adjusted to 2015 because it is secondary 
    and the next secondary element is in 2015' UNION SELECT
1,
'Flashings',
0,
CAST('1 Jun 2015' AS datetime),
'This should get it''s date adjusted to Sep 2015 because it is secondary 
    and the next secondary element is in  Sep 2015' UNION SELECT
1,
'Underground drainage',
0,
CAST('1 Sep 2015' AS datetime),
'This should appear unadjusted because it is secondary and there is a 
    preceding secondary element for the same property'
)
SELECT
    *
FROM t1
ORDER BY date

後続のセカンダリ要素がないセカンダリ要素を除外し、後続の要素がある日付を後続の要素の日付に調整するにはどうすればよいですか?

そして

次のクエリは、必要なものを返す必要があります。

WITH T1 AS
( 

    SELECT * 
        , ROW_NUMBER() OVER (PARTITION BY propertyid, isprimary ORDER BY date) AS PropNo
        , COUNT(*) OVER (PARTITION BY propertyid, isprimary) AS PropCount
    FROM 
        -- Replace below with your source data table
         (VALUES(1,'Bathroom condition',1,'2014-04-01')
        ,(1,'External wall finish',0,'2014-04-01') 
        ,(1,'Chimney stacks',0,'2015-04-01') 
        ,(1,'Principal roof covering',0,'2016-04-01') 
        ,(2,'Damp proof course',0,'2016-04-01')) T(propertyid, text, isprimary, date)
)
SELECT 
      T1.propertyid
    , T1.text
    , T1.isprimary
    , CASE 
          WHEN T1.isprimary = 1 OR T1.PropNo = T1.PropCount - 1 THEN T1.date
          ELSE ISNULL(T1Next.date, T1.date) END AS [date]
FROM T1 
LEFT JOIN T1 AS T1Next ON T1.propertyid = T1Next.propertyid 
    AND T1.isprimary = T1Next.isprimary
    AND T1.PropNo = T1Next.PropNo - 1
WHERE T1.isprimary = 1
    OR (T1.PropNo < T1.PropCount)

ROW_NUMBER()関数とCOUNT(*)関数を使用して、後続の行があるかどうかを判別します。次の行の日付を適用するには、LEFTJOINを使用します。

編集左結合をこれに変更すると、結合は2次要素でのみ発生し、2つおきの要素でのみ発生します。

LEFT JOIN T1 AS T1Next ON T1.propertyid = T1Next.propertyid 
    AND T1.isprimary = 0
    AND T1Next.isprimary = 0
    AND T1.PropNo = T1Next.PropNo - 1
    AND T1Next.PropNo % 2 = 0

つまり、caseステートメントは必要ありません。これだけです。

ISNULL(T1Next.date, T1.date) AS [date]

しかし、whereステートメントは完全に正しくありません。これは機能します:

WHERE T1.isprimary = 1
    OR (T1.PropNo % 2 = 0)     --every 2nd one
    OR T1Next.date IS NOT NULL --and the 1st if there is a 2nd

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

日付付きのPythonで条件付きで行を削除する

分類Dev

MySQLで日付の前/後/後を条件付きで選択する方法は?

分類Dev

次の日付を調整する

分類Dev

awkを使用して条件付きで複数の後続行に行を追加する方法

分類Dev

Excelの条件付き書式-今日からの次の日付で行を強調表示します

分類Dev

mysqlの最後の行を条件付きで削除する

分類Dev

日付番号の後の文字で日付を解析する方法

分類Dev

日付を含めるようにggplotのx軸を調整する方法

分類Dev

条件付きの行を抽出する方法

分類Dev

現在の日付から1時間を条件付きで追加する方法

分類Dev

パンダで条件付き形式の日付列を作成する方法

分類Dev

R-group_byの最初の行を条件付きで削除する方法

分類Dev

SQLServerで条件付きの複数の行を更新する方法

分類Dev

日付列の調整(日付ギャップを埋め、特定の日付まで更新します)

分類Dev

特定の日付の後に条件付き分割を停止する方法はありますか?

分類Dev

条件付きでDataFrameの行を取得する方法

分類Dev

rの行値を条件付きで減算する方法

分類Dev

VBAで条件付きの重複行を削除する方法

分類Dev

SQL Serverの「島の検索」(連続する行)で連続する日付数/日を決定する方法

分類Dev

PostgreSQL-条件付きの後に行の値を連結する方法

分類Dev

JDateChooserでJCalendar内の日付を強調表示する方法は?

分類Dev

JavaScriptで年の最初の日付と最後の日付を取得する方法

分類Dev

制約付きのobjを条件付きで作成する方法

分類Dev

Pythonで前月の最初の日付と最後の日付の日付範囲を計算する方法

分類Dev

SQLで条件付きで日付を別の日付に置き換える方法は?

分類Dev

現在の日付を使用してDjangoCharFieldの選択を調整する

分類Dev

CSSを使用して最後の行を条件付きで非表示にする

分類Dev

PHPで10日後の日付を計算する方法は?

分類Dev

TimeZoneの調整中に、特定の日付文字列をSwift3の日付に変換する

Related 関連記事

  1. 1

    日付付きのPythonで条件付きで行を削除する

  2. 2

    MySQLで日付の前/後/後を条件付きで選択する方法は?

  3. 3

    次の日付を調整する

  4. 4

    awkを使用して条件付きで複数の後続行に行を追加する方法

  5. 5

    Excelの条件付き書式-今日からの次の日付で行を強調表示します

  6. 6

    mysqlの最後の行を条件付きで削除する

  7. 7

    日付番号の後の文字で日付を解析する方法

  8. 8

    日付を含めるようにggplotのx軸を調整する方法

  9. 9

    条件付きの行を抽出する方法

  10. 10

    現在の日付から1時間を条件付きで追加する方法

  11. 11

    パンダで条件付き形式の日付列を作成する方法

  12. 12

    R-group_byの最初の行を条件付きで削除する方法

  13. 13

    SQLServerで条件付きの複数の行を更新する方法

  14. 14

    日付列の調整(日付ギャップを埋め、特定の日付まで更新します)

  15. 15

    特定の日付の後に条件付き分割を停止する方法はありますか?

  16. 16

    条件付きでDataFrameの行を取得する方法

  17. 17

    rの行値を条件付きで減算する方法

  18. 18

    VBAで条件付きの重複行を削除する方法

  19. 19

    SQL Serverの「島の検索」(連続する行)で連続する日付数/日を決定する方法

  20. 20

    PostgreSQL-条件付きの後に行の値を連結する方法

  21. 21

    JDateChooserでJCalendar内の日付を強調表示する方法は?

  22. 22

    JavaScriptで年の最初の日付と最後の日付を取得する方法

  23. 23

    制約付きのobjを条件付きで作成する方法

  24. 24

    Pythonで前月の最初の日付と最後の日付の日付範囲を計算する方法

  25. 25

    SQLで条件付きで日付を別の日付に置き換える方法は?

  26. 26

    現在の日付を使用してDjangoCharFieldの選択を調整する

  27. 27

    CSSを使用して最後の行を条件付きで非表示にする

  28. 28

    PHPで10日後の日付を計算する方法は?

  29. 29

    TimeZoneの調整中に、特定の日付文字列をSwift3の日付に変換する

ホットタグ

アーカイブ