2

次のスキーマがあり、typeIdが10のクライアントの数を最初に表示したいと思います。次のデータの答えは2になります(クライアントID 1000および1003は、1月1日に10、1月2日に11になります。

CREATE TABLE Event (ClientId int, TypeId int, Date smalldatetime)
INSERT Event (ClientId , TypeId, Date) VALUES (1000, 10, '1 JAN 12')
INSERT Event (ClientId , TypeId, Date) VALUES (1000, 11, '2 JAN 12')
INSERT Event (ClientId , TypeId, Date) VALUES (1001, 11, '1 JAN 12')
INSERT Event (ClientId , TypeId, Date) VALUES (1001, 10, '2 JAN 12')
INSERT Event (ClientId , TypeId, Date) VALUES (1002, 11, '1 JAN 12')
INSERT Event (ClientId , TypeId, Date) VALUES (1003, 10, '1 JAN 12')
INSERT Event (ClientId , TypeId, Date) VALUES (1003, 11, '2 JAN 12')

ROW_NUMBER()を使用していくつかのクエリを試しましたが、少し迷っています。

4

3 に答える 3

3

これを試して:

SELECT a.* FROM 
    (SELECT CLIENTID,TYPEID,MIN(DATE) AS DATE
     FROM EVENT
     GROUP BY CLIENTID, TYPEID)A
JOIN
    (SELECT CLIENTID,MIN(DATE) AS DATE
     FROM EVENT
     GROUP BY CLIENTID)B
 ON   B.CLIENTID=A.CLIENTID
 AND  B.DATE=A.DATE
 WHERE TYPEID=10


SQLフィドルデモ

于 2012-08-20T10:38:43.070 に答える
1

これは、2つのrow_number()で実行できます。

select count(*)
from (select e.*,
             row_number() over (partition by clientId order by date) as seqnum,
             row_number() over (partition by clientId, typeid order by date) as ct_seqnum
      from event e
     ) e
where seqnum = 1 and ct_seqnum = 1 and typeid = 10

これは、全体的な順序付けとタイプによる順序付けを行っています。あなたの条件は、typeidが10である行でこれらの両方が1であると言うことと同じです。

于 2012-08-20T14:54:51.967 に答える
1

次のことを試すことができます。

  • 自己参加ClientID
  • typeID自己結合テーブルのが大きい場合のみ
  • 自己結合テーブルのDate方が大きい

SQLステートメント

SELECT e1.*
FROM   Event e1
       INNER JOIN Event e2 ON e2.ClientID = e1.ClientID
                              AND e2.TypeID > e1.TypeID
                              AND e2.Date > e1.Date
WHERE  e1.TypeID = 10

フィドルの例

于 2012-08-20T10:32:23.723 に答える