1

これはクレイジーな質問ですが、基本的に条件に一致する最初の行をマークする必要がありますが、残りはマークする必要はありません。たとえば、すべてのユーザーの毎日のログインの履歴がありますが、毎月特定の日付より前のログインを表示したいのですが、例えば:

UserId     LoginDate
1          2011-12-31
2          2012-12-31
1          2012-01-01
2          2012-01-02
1          2012-01-02
2          2012-01-03

等....

次のような結果セットで毎月最初のログインを返すSQLクエリが必要です。

UserId     LoginDate     WasFirstLoginOfMonth
1          2011-12-31    0
2          2012-12-31    0
1          2012-01-01    1
2          2012-01-02    1
1          2012-01-02    0
2          2012-01-03    0

等....

これはおかしな要件のように思えますが、どのログインが特定の日付条件を満たすかを知る必要がありますが、1つだけが可能で、残りはできません。

それが最初であるかどうかを確認するために各行をゆっくりと副選択せずにこれを行う方法はありますか?

助けてくれてありがとう。

4

1 に答える 1

2

このrow_number() 関数を使用すると、データを分割および並べ替えることができます。

したがって、このクエリでは、rnはユーザー、年、月ごとのログインの序数を表します。したがって、その値が1、の場合、それはその月の最初のログインです。

select * 
from
(
select *, 
       row_number() over 
       (
            partition by userID, 
            year(logindate),
            month(logindate)
            order by logindate
       ) rn
from yourtable
)  v
where rn = 1
于 2012-11-29T09:50:36.020 に答える