SQLでユーザーのその日の最新記録を取得する

1日当たりの同じテーブルに同じユーザのエントリが複数ある場合に、そのユーザのその日の最新の記録を取得する方法。

例えば:

Id      UserName               CreatedOn
1       B               2018-11-20
2       A               2018-12-20
3       A               2018-11-19
4       B               2018-11-18

ユーザーA、Bの結果が欲しいのですが:

Id      UserName               CreatedOn
2       A               2018-12-20
1       B               2018-11-20
0
より多くのサンプルデータが必要です。 select * from username = 'A' を使用するだけで、現在の結果をデータから取得できます
追加された 著者 Lee Mac,
ID 4が返されないのはなぜですか?時間的価値がないので、行が「もっと」最近であること、 ID が高いことを定義するものは何ですか? ( ID の値が前に戻るほど大きくになっていることを考えると、数字が小さいほど最近の数字であることを暗示します)
追加された 著者 Larnu,
あなたの最新の編集は物事をもっと混乱させるだけです。あなたは「1日の表に同じユーザーの 1日あたりの最新記録を取得する方法」と述べます。したがって、データに基づいて、サンプルデータのすべての行が返されるはずです。 同じ日に複数のエントリがあるユーザーはいないため、これらはすべてその日の "最新"の行です。
追加された 著者 Larnu,
@ Larnu、私が理解したことは、今は一日の数が重要であるということです、彼はただその日の最新の記録を望んでいるということです。
追加された 著者 affanBajwa,
私は今ユーザーAを探しています
追加された 著者 Shailendra Pal,
誰かが私のアップデート要件をチェックできますか?
追加された 著者 Shailendra Pal,

7 答え

Create Table #tbl
(
Id Int,
UserName VarChar(25),
CreatedOn Date
)

Insert Into #tbl Values
(1,'B','2018-11-20'),
(2,'A','2018-12-20'),
(3,'A','2018-11-19'),
(4,'B','2018-11-18')


Select Username, Max(CreatedOn) As LastDT from #tbl
Group By UserName

結果:

Username    LastDT
A           2018-12-20
B           2018-11-20

更新:これは日ごとにグループ化するとうまくいきます:[DateTime]で年選択を使う

Create Table #tbl
(
Id Int,
UserName VarChar(25),
CreatedOn DateTime
)

Insert Into #tbl Values
(1,'B','2018-11-20 10:45:12.000'),
(2,'A','2018-12-20 07:45:12.000'),
(3,'A','2018-11-19 09:45:12.000'),
(4,'B','2018-11-18 11:45:12.000'),
(5,'B','2018-11-20 01:50:12.000')

 Select  Username, Max(CreatedOn) As LastDT from #tbl
Where DatePart(year,CreatedOn) = '2018'
Group By UserName, DatePart(dayofyear ,CreatedOn)
Order By UserName

日ごとの結果:

Username    LastDT
A           2018-11-19 09:45:12.000
A           2018-12-20 07:45:12.000
B           2018-11-18 11:45:12.000
B           2018-11-20 10:45:12.000
2
追加された
彼が必要としているのは、毎日の最新の記録です。
追加された 著者 affanBajwa,
@ affanBajwa、私は日ごとにグループ分けできるように更新しました。サンプルデータではこれを考慮に入れていないので、説明するためにDateTimeフィールドを指定しました。
追加された 著者 level3looper,

私はあなたが単にユーザーごとの最新の記録がほしいと思うと思います

select  *
from    (
            select  *, rn = row_number() over (partition by UserName order by CreatedOn desc)
            from    yourtable
        ) d
where   d.rn = 1
order by CreatedOn desc
0
追加された

次のSQL文のように dense_rank を使用できます。

  select Id, UserName, CreatedOn
    from
    (
    select *,
           dense_rank() over ( partition by username order by CreatedOn desc) as
           max_CreatedOn 
      from t 
    ) q
   where max_CreatedOn = 1;

Rextesterデモ

0
追加された

SQL ServerでWITH TIES関数を使用する

SELECT TOP 2 WITH TIES UserName,CreatedOn  
FROM #tbl
ORDER BY ( ROW_NUMBER()OVER(PARTITION BY UserName ORDER BY CreatedOn DESC ))

結果

UserName    CreatedOn
-----------------------
  A         2018-12-20
  B         2018-11-20
0
追加された

A の単独の結果が欲しい場合は、以下のクエリを入力してください。

SELECT * FROM myTable WHERE UserName = 'A' ORDER BY CreatedOn DESC

特定の数の A 行が必要な場合は、

SELECT top 2 * FROM myTable WHERE UserName = 'A' ORDER BY CreatedOn DESC
0
追加された

各ユーザーの最新の記録が必要な場合は、うまくいくはずです。

SELECT UserName, MAX(CreatedOn) FROM yourTable GROUP BY UserName

各ユーザーの最新のエントリが返されます

出力:

UserName       CreatedOn
    A          2018-12-20
    B          2018-11-20
0
追加された
しかし、OPは1行ではなく2行を期待しています。
追加された 著者 Larnu,
OPの説明の後に編集されました。
追加された 著者 Noob dev,

TOP キーワードを使用して次の簡単なクエリを試すことができます。

Create Table #temp
(
Id Int,
UserName VarChar(25),
CreatedOn Date
)

Insert Into #temp Values
(1,'B','2018-11-20'),
(2,'A','2018-12-20'),
(3,'A','2018-11-19'),
(4,'B','2018-11-18')

Select TOP 2 * from #temp ORDER BY CreatedOn DESC

出力は以下の通りです

Id  UserName    CreatedOn
-------------------------
2   A          2018-12-20
1   B          2018-11-20
0
追加された