0

次の表があります。

   ID SampleID SampleState Date
1   A1   First 1/10/2013
2   A1   Second 1/11/2013
3   A1   Last   1/12/2013
4   A2   First  1/10/2013
5   A2   Closed 1/11/2013
6   A3   First  1/10/2012
7   A3   Second 1/10/2012

次のルールを使用して行を引き出す必要があります。

a.) Display the lowest date of each SampleID provided the date is more than 10 days from current day
b.) Display the latest state of each SampleID.
c.) Do not display the SampleID if any of the state of the SampleID is Closed

たとえば、このテーブルの場合、出力は次のようになります。

    SampleID SampleState Date
     A1   Last   1/10/2013
     A3   Second 1/10/2012

クエリにすべての結果が表示されません。

SELECT  a.SampleID,a.SampleState,b.date
FROM    ListOfStates 
        INNER JOIN
        (
            SELECT  ID,SampleID, Max(ID) Max_ID, SampleState
            FROM    ListOfStates 
            GROUP   BY SampleID
        ) a 
    on a.Max_ID = ListOfStates.ID
        INNER JOIN
        (
            SELECT  ID,SampleID, Min(ID) min_ID, date
            FROM    ListOfStates 
            GROUP   BY SampleID
        ) b
on b.min_ID = ListOfStates.ID

where              

 b.Date  < DATE_SUB(CURDATE(), INTERVAL 10 DAY)
and a.SampleState !='Closed'
4

1 に答える 1

1

以下は条件を取得し、それらを単一のクエリに入れます。

select SampleId,
       min(case when t.Date < DATE_SUB(CURDATE(), INTERVAL 10 DAY) then date end) as MinDate,
       max(case when t.date = tsum.maxDate then state end) as MostRecentState
from t join
     (select SampleId, max(date) as maxDate
      from t
      group by SampleId
     ) tsum
     on t.SampleId = tsum.SampleId
group by SampleId
having max(case when state = 'Closed' then 1 else 0 end) = 0 and
       min(date) < DATE_SUB(CURDATE(), INTERVAL 10 DAY)

鍵は条件付き集計だと思います。句 (または句)を使用してフィルタリングするのではなくcase、句内のステートメントを使用して集計できます。selectwherehaving

于 2013-02-05T01:59:57.307 に答える