SQL'deki bir kullanıcı için günün en son kaydını alın

Günde aynı tabloda aynı kullanıcının birden fazla girişi varsa, bir kullanıcı için günün en son kaydını nasıl alabilirsiniz.

Örneğin:

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 Kullanıcısı için sonuç istiyorum:

Id      UserName               CreatedOn
2       A               2018-12-20
1       B               2018-11-20
0
Daha fazla örnek veri gereklidir; Mevcut sonucunuz, kullanıcı adınız = 'A' tablosundaki select * kullanılarak basitçe verilerinizden elde edilebilir.
katma yazar Lee Mac, kaynak
Kimlik 4 neden iade edilmiyor? Zaman değeriniz olmadığından, satırın "daha" son olduğunu, ID değerinin daha yüksek olduğunu ne tanımlar? ( ID değerinin, ne kadar ileri geri giderseniz büyüyünce arttığını göz önünde bulundurarak, bu, , sayının ne kadar düşük olduğunu gösterir.
katma yazar Larnu, kaynak
En son düzenlemeniz yalnızca işleri daha fazla karıştırır. Aynı tabloda birden fazla kullanıcının Günde Tablo'da birden fazla Kullanıcısı varsa, kullanıcının "Nasıl elde edilir? En son günlük kayıt " ifadesini belirtirsiniz. Bu nedenle, verilerinize dayanarak, örnek verilerinizdeki her satır döndürülmelidir. Hepsi aynı günde birden fazla giriş yapılmadığından, o gün için "en son" satırın tümü.
katma yazar Larnu, kaynak
@Larnu, anladığım şey şu ki, gün sayısı ne olursa olsun, sadece günün/günlerin en son kaydını istiyor.
katma yazar affanBajwa, kaynak
Şu anda Kullanıcı A'yı arıyorum
katma yazar Shailendra Pal, kaynak
Birisi güncelleme gereksinimi kontrol edebilir mi?
katma yazar Shailendra Pal, kaynak

7 cevap

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

Sonuç:

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

GÜNCELLEME: Bu, güne göre gruplanıyorsa çalışır: [DateTime] ile bir yıl seçimi kullanma

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

Gün Sonucu:

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
katma
Tüm zamanların en son kaydını vereceğine inanıyorum, ihtiyacı olan şey her günün en son kaydı.
katma yazar affanBajwa, kaynak
@ affanBajwa, güne göre gruplamaya izin verecek şekilde güncellendi. Örnek veriler buna izin vermedi, bu yüzden göstermek için bir DateTime alanı sağladım.
katma yazar level3looper, kaynak

Sanırım sadece kullanıcı başına en son kaydı istiyorsun.

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
katma

Aşağıdaki sql deyimindeki gibi dense_rank 'i kullanabilirsiniz.

  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 Demo

0
katma

Sql sunucusunda WITH TIES işlevini kullanarak

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

Sonuç

UserName    CreatedOn
-----------------------
  A         2018-12-20
  B         2018-11-20
0
katma

Yalnızca A kayıtlarının sonucunu görmek istiyorsanız, aşağıdaki sorgu

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

Belirli sayıda A satır istiyorsanız,

SELECT top 2 * FROM myTable WHERE UserName = 'A' ORDER BY CreatedOn DESC
0
katma

Her kullanıcı için en son kaydı istiyorsanız, çalışması gerekir:

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

Her kullanıcı için en son girişi döndürür

Çıktı :

UserName       CreatedOn
    A          2018-12-20
    B          2018-11-20
0
katma
Fakat OP 1 satır beklemiyor, 2 satır bekliyor.
katma yazar Larnu, kaynak
OP açıklamalarından sonra düzenlenir.
katma yazar Noob dev, kaynak

TOP anahtar sözcüğünü kullanarak aşağıdaki basit sorguyu deneyebilirsiniz

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

Çıktı aşağıda gösterildiği gibidir

Id  UserName    CreatedOn
-------------------------
2   A          2018-12-20
1   B          2018-11-20
0
katma