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

日付が重複している期間内の最大

    私が正しく理解していれば、期間内の特定のステータスの個別のエントリをカウントしたい...そうであれば、 DISTINCT を使用する必要があります count() の句 count(*) から count(distinct Entry_id) に変更

    with c (Status_Id, Entry_Id, Start_Date) AS (
      select Status_Id, Entry_Id, Start_Date from tbl where
      (End_Date BETWEEN '19000101' AND '21000101')
      AND ((Start_Date BETWEEN '19000101' AND '21000101')
      OR End_Date <= '21000101'))
    select Status_Id, count(distinct Entry_Id) as cnt from 
     (select Entry_Id, max(start_date) as start_date from c
      group by Entry_Id) d inner join
    c on c.Entry_Id = d.Entry_Id
    and c.start_date = d.start_date
    GROUP BY Status_Id WITH ROLLUP
    

    編集

    特定のエントリに対してどのステータスが返されるかを気にしない限り、内部クエリを変更して最初のステータスを返し、ステータスも結合できると思います

    with c (Status_Id, Entry_Id, Start_Date) AS (
      select Status_Id, Entry_Id, Start_Date from tbl where
      (End_Date BETWEEN '19000101' AND '21000101')
      AND ((Start_Date BETWEEN '19000101' AND '21000101')
      OR End_Date <= '21000101'))
    select c.Status_Id, count(c.Entry_Id) as cnt from 
     (select Entry_Id, Start_Date, (select top 1 Status_id from c where Entry_Id = CC.Entry_Id and Start_Date = CC.Start_Date) as Status_Id
      from (select Entry_Id, max(start_date) as start_date from c
      group by Entry_Id) as CC) d inner join
    c on c.Entry_Id = d.Entry_Id
    and c.start_date = d.start_date
    and c.status_id = d.status_id
    GROUP BY c.Status_Id
    

    結果

    Status_id Count
     489       2
     492       1
     495       1
    


    1. mysqlのダミーデータをテーブルに自動的に入力します

    2. テーブルが2つの異なるデータベースシステムからのものである左外部結合

    3. 挿入のDate(Now())に相当する日時

    4. クエリがインデックスにヒットしません-これらはインデックスを作成するのに適切な列ですか?