sql >> データベース >  >> RDS >> Oracle

欠落している日付を順番に見つける

    ギャップのあるIDの簡単なリストを取得するには、詳細を追加せずに、各IDを個別に確認する必要があります。@ mikeyが提案したように、月数をカウントし、最初と最後の日付を確認して、いくつあるかを確認できます。スパンする月。

    テーブルにmonthという列がある場合 (date以降 引用符で囲まれた識別子でない限り許可されません)次のように始めることができます:

    select id, count(month), min(month), max(month),
      months_between(max(month), min(month)) + 1 as diff
    from your_table
    group by id
    order by id;
    
            ID COUNT(MONTH) MIN(MONTH) MAX(MONTH)       DIFF
    ---------- ------------ ---------- ---------- ----------
           123            8 01-JUN-14  01-JUL-15          14
           456            7 01-MAR-14  01-NOV-14           9
           789            7 01-MAR-14  01-SEP-14           7
    

    次に、havingで、カウントと月のスパンを比較します 条項:

    select id
    from your_table
    group by id
    having count(month) != months_between(max(month), min(month)) + 1
    order by id;
    
            ID
    ----------
           123
           456
    

    IDに対して実際に月に複数のレコードを持つことができる場合、および/または記録された日付が月の始まりではない可能性がある場合は、日付を正規化するためにもう少し作業を行うことができます:

    select id,
      count(distinct trunc(month, 'MM')),
      min(trunc(month, 'MM')),
      max(trunc(month, 'MM')),
      months_between(max(trunc(month, 'MM')), min(trunc(month, 'MM'))) + 1 as diff
    from your_table
    group by id
    order by id;
    
    select id
    from your_table
    group by id
    having count(distinct trunc(month, 'MM')) !=
      months_between(max(trunc(month, 'MM')), min(trunc(month, 'MM'))) + 1
    order by id;
    


    1. mysql_queryはすべてをコミットしますか

    2. PHPを使用したMySQLデータベースへの複数のチェックボックスデータの保存

    3. INSERT ... ON CONFLICTDOUPDATEのあいまいな列参照

    4. Elastic Searchの全文とmysqlの全文?