不連続な期間のMINおよびMAX日付を検索YYYYMM00

ニコラエッセ

次の2つのテーブルがあります。

  • DimensionTimeは、YYYMM00形式でID順に並べられた毎月を含むテーブルです。
  • LogPlayerは、プレーヤーと特定の月に関連するいくつかの統計があるテーブルです。

私が取得したいのは次のとおりです。

+--------+--------+----------+----------+
| Player |  Team  |  Start   |   End    |
+--------+--------+----------+----------+
| John   | Red    | 20180100 | 20180300 |
| John   | Red    | 20180600 | 20180700 |
| Luke   | Yellow | 20180100 | 20180100 |
| Luke   | Yellow | 20190100 | 20190100 |
+--------+--------+----------+----------+

ピリオドが不連続であるため、MIN関数とMAX関数を使用できません...どうすれば解決できますか?MIN / MAXをGROUPBYと組み合わせて試してみましたが、何も役に立ちません。Stackoverflowで質問や回答が見つかりませんでした。

SELECT *
    INTO #DimensionTime
    FROM (
        SELECT 1 AS [ID], 20180100 AS [TIMEID]
        UNION ALL
        SELECT 2 AS [ID], 20180200 AS [TIMEID]
        UNION ALL
        SELECT 3 AS [ID], 20180300 AS [TIMEID]
        UNION ALL
        SELECT 4 AS [ID], 20180400 AS [TIMEID]
        UNION ALL
        SELECT 5 AS [ID], 20180500 AS [TIMEID]
        UNION ALL
        SELECT 6 AS [ID], 20180600 AS [TIMEID]
        UNION ALL
        SELECT 7 AS [ID], 20180700 AS [TIMEID]
        UNION ALL
        SELECT 8 AS [ID], 20180800 AS [TIMEID]
        UNION ALL
        SELECT 9 AS [ID], 20180900 AS [TIMEID]
        UNION ALL
        SELECT 10 AS [ID], 20181000 AS [TIMEID]
        UNION ALL
        SELECT 11 AS [ID], 20181100 AS [TIMEID]
        UNION ALL
        SELECT 12 AS [ID], 20181200 AS [TIMEID]
        UNION ALL
        SELECT 13 AS [ID], 20190100 AS [TIMEID]
        UNION ALL
        SELECT 14 AS [ID], 20190200 AS [TIMEID]
        UNION ALL
        SELECT 15 AS [ID], 20190300 AS [TIMEID]
    ) A

SELECT *
INTO #LogPlayer
FROM (
    SELECT 'John' AS [Player], 'Red' AS [Team], 20180100 AS [TIMEID]
    UNION ALL
    SELECT 'John' AS [Player], 'Red' AS [Team], 20180200 AS [TIMEID]
    UNION ALL
    SELECT 'John' AS [Player], 'Red' AS [Team], 20180300 AS [TIMEID]
    UNION ALL
    SELECT 'John' AS [Player], 'Red' AS [Team], 20180600 AS [TIMEID]
    UNION ALL
    SELECT 'John' AS [Player], 'Red' AS [Team], 20180700 AS [TIMEID]
    UNION ALL
    SELECT 'Luke' AS [Player], 'Yellow' AS [Team], 20180100 AS [TIMEID]
    UNION ALL
    SELECT 'Luke' AS [Player], 'Yellow' AS [Team], 20190100 AS [TIMEID]
) B
ゴードン・リノフ

これは一種のギャップと島の問題です。SQL Server 2005のようなサポートされていない古いソフトウェアでも、そのバージョンにはが含まれているため、解決可能row_number()です。

1つのトリックは、時刻IDを真正な日付/時刻に変換することです。もう1つのトリックは、日付/時刻の値から連続する月数を引くことによってグループを定義することです。

select player, team, min(timeid), max(timeid)
from (select lp.*,
             row_number() over (partition by player, team order by timeid) as seqnum,
             cast(cast(timeid + 1 as varchar(255)) as datetime) as yyyymm
      from logplayer lp
     ) lp
group by player, team, dateadd(month, - seqnum, yyyymm)
order by player, team, min(timeid);

これがdb <>フィドルです。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Oracle SQLの連続および非連続の日付スパン:最も早い日付の検索

分類Dev

Oracle-月次、四半期、および年次の日付を検索

分類Dev

日付から2つの日付の間の検索、およびテキスト検索クエリ

分類Dev

連続する日付の有効期間を結合する

分類Dev

特定の年の日付を含むSQL検索期間

分類Dev

正確な日付の左結合値、および欠落している場合は前の値を検索

分類Dev

今日の日付を連続して検索するマクロ

分類Dev

Rの期間(開始時間と終了時間、および時間と分での期間)に基づいて最長の日付を計算する方法

分類Dev

R(data.table)のレコードで2週間連続の最初の日付を検索します

分類Dev

連続する期間のリストを効率的に検索する

分類Dev

2つの日付フィールドで特定の期間を検索する

分類Dev

MINおよびMAXを使用したGROUPBY-ソリューションの日付範囲内に収まる

分類Dev

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

分類Dev

パンダで同じ連続要素のブロック(およびそのサイズ)を検索する

分類Dev

連続した日付範囲のレコードを持つデータセットからの最小および最大日付の日付範囲

分類Dev

日付間の日時の範囲を生成する必要がありますが、時刻は午前02:00:00に開始および終了します

分類Dev

時間部分のないAzureSearchの日付を検索する

分類Dev

PandasDataFrameで連続する日付のグループを検索します

分類Dev

Excelワークシートの「日付タイプ」セルのみを検索および編集する方法

分類Dev

日付間のMySQL検索

分類Dev

SQLは特定の期間内に連続するトランザクションを検索します

分類Dev

日付間の日を検索しようとする場合のORA-30076

分類Dev

SQL:特定の期間におけるユーザーのステータス変更日を検索します

分類Dev

週、月、四半期、および年のImpala日付

分類Dev

ソートできない日付間の間隔のDatatablesおよびDateTime形式

分類Dev

MySQLは、日付が連続している期間のカウントを取得します

分類Dev

日付の作成期間は、リスト内で連続しています(日付の差が1日)

分類Dev

SQL Serverはテーブル内のシーケンス日付を検索し、可能な場合は期間を作成します

分類Dev

条件に基づいてデータをサブセット化および名前変更し、Dplyr内の期間を検索します

Related 関連記事

  1. 1

    Oracle SQLの連続および非連続の日付スパン:最も早い日付の検索

  2. 2

    Oracle-月次、四半期、および年次の日付を検索

  3. 3

    日付から2つの日付の間の検索、およびテキスト検索クエリ

  4. 4

    連続する日付の有効期間を結合する

  5. 5

    特定の年の日付を含むSQL検索期間

  6. 6

    正確な日付の左結合値、および欠落している場合は前の値を検索

  7. 7

    今日の日付を連続して検索するマクロ

  8. 8

    Rの期間(開始時間と終了時間、および時間と分での期間)に基づいて最長の日付を計算する方法

  9. 9

    R(data.table)のレコードで2週間連続の最初の日付を検索します

  10. 10

    連続する期間のリストを効率的に検索する

  11. 11

    2つの日付フィールドで特定の期間を検索する

  12. 12

    MINおよびMAXを使用したGROUPBY-ソリューションの日付範囲内に収まる

  13. 13

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

  14. 14

    パンダで同じ連続要素のブロック(およびそのサイズ)を検索する

  15. 15

    連続した日付範囲のレコードを持つデータセットからの最小および最大日付の日付範囲

  16. 16

    日付間の日時の範囲を生成する必要がありますが、時刻は午前02:00:00に開始および終了します

  17. 17

    時間部分のないAzureSearchの日付を検索する

  18. 18

    PandasDataFrameで連続する日付のグループを検索します

  19. 19

    Excelワークシートの「日付タイプ」セルのみを検索および編集する方法

  20. 20

    日付間のMySQL検索

  21. 21

    SQLは特定の期間内に連続するトランザクションを検索します

  22. 22

    日付間の日を検索しようとする場合のORA-30076

  23. 23

    SQL:特定の期間におけるユーザーのステータス変更日を検索します

  24. 24

    週、月、四半期、および年のImpala日付

  25. 25

    ソートできない日付間の間隔のDatatablesおよびDateTime形式

  26. 26

    MySQLは、日付が連続している期間のカウントを取得します

  27. 27

    日付の作成期間は、リスト内で連続しています(日付の差が1日)

  28. 28

    SQL Serverはテーブル内のシーケンス日付を検索し、可能な場合は期間を作成します

  29. 29

    条件に基づいてデータをサブセット化および名前変更し、Dplyr内の期間を検索します

ホットタグ

アーカイブ