2つの日付の間の日付範囲を見つけて、列を繰り返します

ヘマントクマール
    A                       B               C
0   10062-35551-49007-45097 8/31/2014 0:00  233
1   10062-35551-49007-45097 10/31/2014 0:00 14
2   10062-35551-49007-45097 12/31/2014 0:00 22

BとCの日付範囲の間のすべての月が、次のようにその日付範囲で繰り返されるため、出力が必要です。

    A                       B               C
0   10062-35551-49007-45097 8/31/2014 0:00  233
1   10062-35551-49007-45097 9/30/2014 0:00  233
2   10062-35551-49007-45097 10/31/2014 0:00 14
3   10062-35551-49007-45097 11/30/2014 0:00 14
4   10062-35551-49007-45097 12/31/2014 0:00 22
GMB

この問題に対処する一般的な方法は、最初に、月末の日付のリストを保持する参照テーブルを作成することです。これは最初は少し余分な努力のように思えるかもしれませんが、これにはクエリの記述がはるかに簡単になるという利点があります(そして主にRDBMSに依存しません)。

テーブルを作成しall_dates、2014年のすべての月末日を保存するとします

create table all_dates (dt date not null primary key);
insert into all_dates values('2014-01-31');
insert into all_dates values('2014-02-28');
insert into all_dates values('2014-03-31');
insert into all_dates values('2014-04-30');
insert into all_dates values('2014-05-31');
insert into all_dates values('2014-06-30');
insert into all_dates values('2014-07-31');
insert into all_dates values('2014-08-31');
insert into all_dates values('2014-09-30');
insert into all_dates values('2014-10-31');
insert into all_dates values('2014-11-30');
insert into all_dates values('2014-12-31');

これで、次のようなクエリを記述できます。

  • B元のテーブルの列の最小値と最大値に基づいて、関連する日付の範囲を選択します
  • NOT EXISTS条件を使用して、各月末日を元のテーブルの関連レコードに結合します

SQL:

SELECT t.A, d.dt B, t.C
FROM 
    all_dates d
    INNER JOIN (
        SELECT MIN(B) minb, MAX(B) maxb FROM mytable
    ) trange  
        ON d.dt >= trange.minb AND d.dt <= trange.maxb 
    INNER JOIN mytable t
        ON t.B <= d.dt
        AND NOT EXISTS (
            SELECT 1 
            FROM mytable t1
            WHERE t1.B <= d.dt AND t1.B > t.B
        )

サンプルデータを使用したdb-fiddleのこのデモは、次のようになります。

| A                       | B           | C   |
| ----------------------- | ----------- | --- |
| 10062-35551-49007-45097 | 2014-08-31  | 233 |
| 10062-35551-49007-45097 | 2014-09-30  | 233 |
| 10062-35551-49007-45097 | 2014-10-31  | 14  |
| 10062-35551-49007-45097 | 2014-11-30  | 14  |
| 10062-35551-49007-45097 | 2014-12-31  | 22  |

PS:使用しているRDBMSを指定しなかったので、MySQLを選択しました。all_tables実際のユースケースに応じて参照テーブルを作成するコードを調整する必要がある場合があります(ただし、最終的なクエリはおそらく変更されないままです)。


ボーナス:これは、列にいくつかの異なる値が存在するユースケースを適切に処理するクエリですA

SELECT t.A, d.dt B, t.C
FROM 
    all_dates d
    INNER JOIN (
        SELECT A, MIN(B) minb, MAX(B) maxb 
        FROM mytable
        GROUP BY A
    ) trange  
        ON d.dt >= trange.minb AND d.dt <= trange.maxb 
    INNER JOIN mytable t
        ON trange.A = t.A
        AND t.B <= d.dt
        AND NOT EXISTS (
            SELECT 1 
            FROM mytable t1
            WHERE 
                t1.A = t.A 
                AND t1.B <= d.dt 
                AND t1.B > t.B
        )

DBフィドルのデモ

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Jodaを使用して2つの日付範囲を繰り返します

分類Dev

2つの範囲(js)の間の日付を生成します

分類Dev

2 つの日付の間の日付範囲を生成します

分類Dev

ルビー、配列のすべての要素を見つける方法は日付範囲にあります

分類Dev

Scalaで日付の範囲を繰り返します

分類Dev

hamlで2つの日付の間の範囲を見つける

分類Dev

2つの日付列から日付範囲を生成します

分類Dev

MySQLは日付範囲内の最大値を見つけます

分類Dev

日付範囲を指定して、その範囲内で重複するイベントを見つけます

分類Dev

C#で2つの日付を繰り返します

分類Dev

異なる日付時間範囲の平均を見つける

分類Dev

日付範囲Postgres間のギャップを見つける

分類Dev

C#で2つの日付の間の週の範囲を取得します

分類Dev

PHP:配列内の2つの日付の間のすべての日付を返します

分類Dev

SQLは、終了日を次の開始日とする2つの日付の間の繰り返し日付を一覧表示します

分類Dev

2つの日付列を使用して新しい行を作成し、合計値を繰り返します

分類Dev

日付範囲から2つの日付の間のデータの日数を取得します

分類Dev

SPARQLの文字列値から日付範囲を見つける

分類Dev

日付の範囲を見つけるための新しい列の作成

分類Dev

2つの日付範囲の結果を表示しますか?

分類Dev

開始日を含む2つの日付の間で繰り返しますか?

分類Dev

Python2つの日付の範囲の間の日付を検索する

分類Dev

Pythonは、日付の範囲(2つの日付の間)でDBFをフィルタリングします

分類Dev

2つの日付範囲の間の行を返すMySQLクエリ

分類Dev

2つの日付範囲の間の日数を取得する方法

分類Dev

SpringDataは2つの日付範囲を比較します

分類Dev

ある範囲の日付の値を見つけて生成する

分類Dev

ある範囲の日付の値を見つけて生成する

分類Dev

小枝の範囲内のすべての日付を繰り返して印刷します

Related 関連記事

  1. 1

    Jodaを使用して2つの日付範囲を繰り返します

  2. 2

    2つの範囲(js)の間の日付を生成します

  3. 3

    2 つの日付の間の日付範囲を生成します

  4. 4

    ルビー、配列のすべての要素を見つける方法は日付範囲にあります

  5. 5

    Scalaで日付の範囲を繰り返します

  6. 6

    hamlで2つの日付の間の範囲を見つける

  7. 7

    2つの日付列から日付範囲を生成します

  8. 8

    MySQLは日付範囲内の最大値を見つけます

  9. 9

    日付範囲を指定して、その範囲内で重複するイベントを見つけます

  10. 10

    C#で2つの日付を繰り返します

  11. 11

    異なる日付時間範囲の平均を見つける

  12. 12

    日付範囲Postgres間のギャップを見つける

  13. 13

    C#で2つの日付の間の週の範囲を取得します

  14. 14

    PHP:配列内の2つの日付の間のすべての日付を返します

  15. 15

    SQLは、終了日を次の開始日とする2つの日付の間の繰り返し日付を一覧表示します

  16. 16

    2つの日付列を使用して新しい行を作成し、合計値を繰り返します

  17. 17

    日付範囲から2つの日付の間のデータの日数を取得します

  18. 18

    SPARQLの文字列値から日付範囲を見つける

  19. 19

    日付の範囲を見つけるための新しい列の作成

  20. 20

    2つの日付範囲の結果を表示しますか?

  21. 21

    開始日を含む2つの日付の間で繰り返しますか?

  22. 22

    Python2つの日付の範囲の間の日付を検索する

  23. 23

    Pythonは、日付の範囲(2つの日付の間)でDBFをフィルタリングします

  24. 24

    2つの日付範囲の間の行を返すMySQLクエリ

  25. 25

    2つの日付範囲の間の日数を取得する方法

  26. 26

    SpringDataは2つの日付範囲を比較します

  27. 27

    ある範囲の日付の値を見つけて生成する

  28. 28

    ある範囲の日付の値を見つけて生成する

  29. 29

    小枝の範囲内のすべての日付を繰り返して印刷します

ホットタグ

アーカイブ