T-SQL / MSSQLでデータをCTE検索するにはどうすればよいですか?

ドンフォード

現在、次のような従業員の時間エントリのリストがあります。

TimeSheetId   TechnicianUserId    TimeSheetDate   FromDatetime              ToDatetime
    1215286               4730    2020-11-10      2020-11-10 14:15:00.000   2020-11-10 15:15:00.000
    1215965               4730    2020-11-10      2020-11-10 15:15:00.000   2020-11-10 15:45:00.000
    1215969               4730    2020-11-10      2020-11-10 15:45:00.000   2020-11-10 17:45:00.000
    1215972               4730    2020-11-10      2020-11-10 17:45:00.000   2020-11-10 23:45:00.000
    1215967               4730    2020-11-10      2020-11-10 23:45:00.000   2020-11-10 23:59:00.000
    1215968               4730    2020-11-11      2020-11-11 00:00:00.000   2020-11-11 00:15:00.000
    1215978               4730    2020-11-11      2020-11-11 00:15:00.000   2020-11-11 00:30:00.000
    1215980               4730    2020-11-11      2020-11-11 16:00:00.000   2020-11-11 16:30:00.000
    1215979               4735    2020-11-11      2020-11-11 00:30:00.000   2020-11-11 08:30:00.000

時間の処理方法のため、行6と7のTimeSheetDateを1日ロールバックする必要があります。これは、その前の行と技術的に連続した時間であり、すべてが11月ではなく11月10日に発生するようにシステムによって処理されるためです。 11.行8(行7の直後ではない)または行9(異なる従業員番号)をロールバックしないでください。

ネストされたクエリを試行すると、行6のみがキャッチされます。TimeSheetIdなしでCTEを試行すると(それを信頼する方法を実装する方法がわからないため)、反復と爆弾をいつ停止するかがわかりません。アウト。行6と7の両方を確実にキャッチするにはどうすればよいですか?

私が試みたCTE:

;WITH CTEDummyData (
                     [TechnicianUserId]
                    ,[TimeSheetDate]
                    ,[FromDatetime]
                    ,[ToDatetime]
                    )
AS (
SELECT [TechnicianUserId]
      ,[TimeSheetDate]
      ,[FromDatetime]
      ,[ToDatetime]
  FROM @DummyTime
 UNION ALL
SELECT [TechnicianUserId]
      ,CASE
            WHEN DATEDIFF(MINUTE,LAG([ToDateTime]) OVER (ORDER BY [FromDatetime]),[FromDatetime]) < 2
                    AND CAST([FromDatetime] AS DATE) <> LAG([TimeSheetDate]) OVER (ORDER BY [FromDatetime])
            THEN DATEADD(DAY,-1,[TimeSheetDate])
            ELSE [TimeSheetDate]
        END
      ,[FromDatetime]
      ,[ToDatetime]
  FROM CTEDummyData
    )
SELECT *
  FROM CTEDummyData
OPTION (MAXRECURSION 24)
mandy1339

SQLループを使用して、必要なすべてのデータが得られるまでデータを繰り返し更新するソリューションを試しました。

DECLARE @NOMOREFORMATTINGNEEDED AS BIT = 0;
IF (EXISTS(SELECT * FROM SYS.tables WHERE name like '%TempDummyTimeTable%'))
BEGIN
    Drop table #TempDummyTimeTable;
END
SELECT * INTO #TempDummyTimeTable FROM DummyTimeTable;

WHILE (@NOMOREFORMATTINGNEEDED = 0)
BEGIN
    update tl set TimeSheetDate = t.TimeSheetDate from #TempDummyTimeTable tl 
                        join #TempDummyTimeTable t on   tl.TechnicianUserId = t.technicianuserid 
                        and ABS(DATEDIFF (MINUTE, tl.FromDatetime, t.ToDatetime)) <= 1
                        and tl.TimeSheetDate <> t.TimeSheetDate 

    IF (not exists(select * from #TempDummyTimeTable tl JOIN #TempDummyTimeTable t on   tl.TechnicianUserId = t.technicianuserid 
                        and ABS(DATEDIFF (MINUTE, tl.FromDatetime, t.ToDatetime)) <= 1
                        and tl.TimeSheetDate <> t.TimeSheetDate ) )
    BEGIN
        SET @NOMOREFORMATTINGNEEDED = 1
    END
END

select * from #TempDummyTimeTable

基本的に、元のテーブルから新しい一時テーブルを作成します。次に、同じ従業員の別の行と連続しているが、TimeSheetDateが異なる行のインスタンスがあるかどうかを確認してから、そのTimeSheetDateを更新します。フラグ@NOMOREFORMATTINGNEEDEDがtrueに設定されるまで、ループ内でこれを繰り返します。このフラグをtrueに設定するのは、異なるTimeSheetDateを持つ連続レコードがもうないことを確認するチェックです。このチェックでは、一方のFromDateTimeがもう一方のToDateTimeから1分以内であることを確認しました。これがあなたのために働くかどうか私に知らせてください。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

T-SQL:文字列に格納されている列にデータを追加するにはどうすればよいですか?

分類Dev

T-SQLステートメントからデータフローに結果セットを追加するにはどうすればよいですか?

分類Dev

このデータをT-SQLのビットフィールドでピボットするにはどうすればよいですか?

分類Dev

T-SQLのXMLタイプで&文字を使用するにはどうすればよいですか?

分類Dev

C#で動的に作成されたt-SQLを更新するにはどうすればよいですか?

分類Dev

T-SQLでデバッグ時にテーブル変数の値を確認するにはどうすればよいですか?

分類Dev

T-SQL カーソルを置き換えるにはどうすればよいですか?

分類Dev

タイムスタンプ間のステータスのレコードを選択するにはどうすればよいですか?T-SQL

分類Dev

T-SQLスクリプトは、Azure SQLデータベースで実行されているのかオンプレミスで実行されているのかをどのように検出する必要がありますか?

分類Dev

Pythonからすでに存在するデータのSQL列を検索するにはどうすればよいですか?

分類Dev

t-sql関数でnull値を無視するにはどうすればよいですか?

分類Dev

T-SQL XML:以下の形式で結果を取得するにはどうすればよいですか?

分類Dev

T-SQLでatan2関数を実行するにはどうすればよいですか?

分類Dev

この条件をT-SQL構文で表現するにはどうすればよいですか?

分類Dev

複雑なT-SQLをLinqに変換するにはどうすればよいですか

分類Dev

このT-SQLをFetch-XMLに変換するにはどうすればよいですか?

分類Dev

T-SQLの特定の値にこの特別なカウンターを作成するにはどうすればよいですか?

分類Dev

SQL Server 2012でデータベース内のすべてのテーブルの列名を検索するにはどうすればよいですか?

分類Dev

T-SQLを使用してURLからXMLを読み取るにはどうすればよいですか?

分類Dev

リモートT-SQLプロシージャを呼び出して、リモート.bakデータベースファイルをリモートSQL Serverインスタンスに復元するにはどうすればよいですか?

分類Dev

T-SQLでVALUESキーワードを使用せずに、テーブルに行を作成するにはどうすればよいですか。

分類Dev

t-sqlでユーザー名とロールを含むすべてのデータベース名のリストを取得するにはどうすればよいですか?

分類Dev

SQLクエリを使用してdelphiのadoデータベースのフィールドを検索するにはどうすればよいですか?

分類Dev

クエリパラメータ内で変数を使用するために、配列から変数をプルするにはどうすればよいですか?SQL Server ManagementStudioでT-SQLを使用しています

分類Dev

SQLプロファイラーでt-sqlコマンドだけを監視するにはどうすればよいですか?

分類Dev

T-SQL for SQL Server 2008 R2で数値をフォーマットするにはどうすればよいですか?

分類Dev

T-SQLでOUTPUTを使用してレコードを削除および挿入するにはどうすればよいですか?

分類Dev

T-SQL(SSMS 2017)で次のレコードの[EffectiveDate] -1に基づいて有効期限を計算するにはどうすればよいですか?

分類Dev

T-SQLでテーブルをスキーマに移動するにはどうすればよいですか

Related 関連記事

  1. 1

    T-SQL:文字列に格納されている列にデータを追加するにはどうすればよいですか?

  2. 2

    T-SQLステートメントからデータフローに結果セットを追加するにはどうすればよいですか?

  3. 3

    このデータをT-SQLのビットフィールドでピボットするにはどうすればよいですか?

  4. 4

    T-SQLのXMLタイプで&文字を使用するにはどうすればよいですか?

  5. 5

    C#で動的に作成されたt-SQLを更新するにはどうすればよいですか?

  6. 6

    T-SQLでデバッグ時にテーブル変数の値を確認するにはどうすればよいですか?

  7. 7

    T-SQL カーソルを置き換えるにはどうすればよいですか?

  8. 8

    タイムスタンプ間のステータスのレコードを選択するにはどうすればよいですか?T-SQL

  9. 9

    T-SQLスクリプトは、Azure SQLデータベースで実行されているのかオンプレミスで実行されているのかをどのように検出する必要がありますか?

  10. 10

    Pythonからすでに存在するデータのSQL列を検索するにはどうすればよいですか?

  11. 11

    t-sql関数でnull値を無視するにはどうすればよいですか?

  12. 12

    T-SQL XML:以下の形式で結果を取得するにはどうすればよいですか?

  13. 13

    T-SQLでatan2関数を実行するにはどうすればよいですか?

  14. 14

    この条件をT-SQL構文で表現するにはどうすればよいですか?

  15. 15

    複雑なT-SQLをLinqに変換するにはどうすればよいですか

  16. 16

    このT-SQLをFetch-XMLに変換するにはどうすればよいですか?

  17. 17

    T-SQLの特定の値にこの特別なカウンターを作成するにはどうすればよいですか?

  18. 18

    SQL Server 2012でデータベース内のすべてのテーブルの列名を検索するにはどうすればよいですか?

  19. 19

    T-SQLを使用してURLからXMLを読み取るにはどうすればよいですか?

  20. 20

    リモートT-SQLプロシージャを呼び出して、リモート.bakデータベースファイルをリモートSQL Serverインスタンスに復元するにはどうすればよいですか?

  21. 21

    T-SQLでVALUESキーワードを使用せずに、テーブルに行を作成するにはどうすればよいですか。

  22. 22

    t-sqlでユーザー名とロールを含むすべてのデータベース名のリストを取得するにはどうすればよいですか?

  23. 23

    SQLクエリを使用してdelphiのadoデータベースのフィールドを検索するにはどうすればよいですか?

  24. 24

    クエリパラメータ内で変数を使用するために、配列から変数をプルするにはどうすればよいですか?SQL Server ManagementStudioでT-SQLを使用しています

  25. 25

    SQLプロファイラーでt-sqlコマンドだけを監視するにはどうすればよいですか?

  26. 26

    T-SQL for SQL Server 2008 R2で数値をフォーマットするにはどうすればよいですか?

  27. 27

    T-SQLでOUTPUTを使用してレコードを削除および挿入するにはどうすればよいですか?

  28. 28

    T-SQL(SSMS 2017)で次のレコードの[EffectiveDate] -1に基づいて有効期限を計算するにはどうすればよいですか?

  29. 29

    T-SQLでテーブルをスキーマに移動するにはどうすればよいですか

ホットタグ

アーカイブ