SQLda foydalanuvchi uchun kunning eng yangi rekordini oling

Bitta foydalanuvchiga bir kunda bir xil foydalanuvchi bir nechta yozuvlari mavjud bo'lsa, foydalanuvchi uchun kunning so'nggi rekordini qanday olish mumkin.

Misol uchun:

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

Natijani istayman A, B foydalanuvchilari uchun Like:

Id      UserName               CreatedOn
2       A               2018-12-20
1       B               2018-11-20
0
Keyinchalik misol ma'lumotlar kerak; Sizning natijangizni ma'lumotlaringizdan oddiygina tanlash-ni tanlang * jadvalda joylashgan foydalanuvchi nomi = 'A' yordamida olish mumkin
qo'shib qo'ydi muallif Lee Mac, manba
Nima uchun ID 4 qaytarilmaydi? Vaqt qiymati bo'lmagani uchun, bir satrning "ko'proq" yaqinligini belgilaydigan nimani anglatadi, ID yuqori qiymatga ega? ( ID qiymatining katta </​​b>) oldinga orqaga ketayotganligini hisobga olsangiz, bu demakdir .
qo'shib qo'ydi muallif Larnu, manba
Sizning oxirgi tahrirlashingiz faqat narsalarni ko'proq sarosimaydi. "kunlik jadvalda bir xil foydalanuvchiga bir nechta Foydalanuvchilar kiritishi mavjud bo'lsa, foydalanuvchi kunlik eng so'nggi rekordini ga olishingiz mumkin. Shunday qilib, ma'lumotlaringizga asoslangan holda, namunaviy ma'lumotlaringizdagi har bir satr qaytarilishi kerak. Hech bir foydalanuvchi bir xil kunida bir nechta yozuvga ega emasligi sababli, bu kunlarning barchasi "eng so'nggi" qator.
qo'shib qo'ydi muallif Larnu, manba
@Larnu, men tushundimki, endi kunduz kuniga taalluqli bo'lsa, u faqat kun/kunning so'nggi rekordini istaydi.
qo'shib qo'ydi muallif affanBajwa, manba
Men hozir A foydalanuvchini qidiryapman
qo'shib qo'ydi muallif Shailendra Pal, manba
yangilanishlar talabi tekshirilishi mumkinmi?
qo'shib qo'ydi muallif Shailendra Pal, manba

7 javoblar

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

Natija:

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

UPDATE: Agar kunduzgi guruhlashda bu ish bajariladi: [YearTime] bilan yil tanlovidan foydalanish

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

Kun bo'yicha natija:

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
qo'shib qo'ydi
O'ylaymanki, u hamma vaqtning eng yangi rekordini o'rnatadi, unga kerak bo'lgan har bir kunning so'nggi rekordidir.
qo'shib qo'ydi muallif affanBajwa, manba
@affanBajwa, men kunduz guruhlash uchun ruxsat berish uchun yangiladim. Namuna ma'lumotlari bunga ruxsat bermadi, shuning uchun ko'rsatish uchun DateTime maydonini taqdim qildim.
qo'shib qo'ydi muallif level3looper, manba

O'ylaymanki, har bir foydalanuvchi uchun so'nggi rekordni xohlaysiz

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
qo'shib qo'ydi

dense_rank -ni quyidagi sql bayonotida ishlatishingiz mumkin

  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 Namoyish

0
qo'shib qo'ydi

SQL serverida "TUG'ILGAN TIES" funksiyasidan foydalanib

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

Natija

UserName    CreatedOn
-----------------------
  A         2018-12-20
  B         2018-11-20
0
qo'shib qo'ydi

Agar A faqat yozuvlar natijasi degani bo'lsa, quyida berilgan so'rov

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

Agar A satrining muayyan sonini bildirmoqchi bo'lsangiz,

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

Har bir foydalanuvchi uchun so'nggi rekordni olishni istasangiz, u holda ishlash kerak:

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

Har bir foydalanuvchi uchun eng yangi yozuvni qaytaradi

Chiqish:

UserName       CreatedOn
    A          2018-12-20
    B          2018-11-20
0
qo'shib qo'ydi
Biroq OP o'laroq 2 qatorni kutmoqda.
qo'shib qo'ydi muallif Larnu, manba
O'T dan keyin aniqlanadi.
qo'shib qo'ydi muallif Noob dev, manba

Top kalit so'zi yordamida quyidagi oddiy so'rovni sinab ko'rishingiz mumkin

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

Chiqish quyida keltirilgan

Id  UserName    CreatedOn
-------------------------
2   A          2018-12-20
1   B          2018-11-20
0
qo'shib qo'ydi