Атрымаць апошнюю запіс у дзень для карыстальніка ў SQL

Як атрымаць апошнюю запіс дня для карыстальніка, калі ёсць некалькі запісаў з таго ж карыстальніка ў табліцы той жа дзень.

Напрыклад:

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
патрабуецца больш выбарка дадзеных; бягучы вынік можа быць атрыманы з дадзеных, проста выкарыстоўваючы абярыце * з табліцы, дзе імя карыстальніка = «A»
дададзена аўтар Lee Mac, крыніца
Чаму ID-не вярнуліся? Як вы не маеце ніякага значэння часу, што вызначае, што радок «больш» нядаўна, ID мае больш высокае значэнне? (Улічваючы, што значэнне ID становіцца <�б> больш чым далей вы ідзяце, што б <�я> азначае, , што чым менш лік, тым больш нядаўна.)
дададзена аўтар Larnu, крыніца
Ваша апошняе рэдагаванне толькі блытае рэчы больш. Вы сцвярджаеце, <�я> «Як атрымаць <�б> За дзень апошняй запісу карыстальніка, калі ёсць шматразовыя карыстальнікі той жа карыстальніка ў табліцы ў дзень» . Такім чынам, на падставе дадзеных, кожны радок дадзеных ўзору павінна быць вернутая. Яны ўсе «самая апошняя» радок у гэты дзень, бо ні адзін карыстальнік не мае некалькі запісаў на <�б> жа дзень.
дададзена аўтар Larnu, крыніца
@Larnu, што я зразумеў, што, у цяперашні час мае значэння колькасці дзён, ён проста хоча, каб апошняя запіс дня/дзён.
дададзена аўтар affanBajwa, крыніца
Я шукаю карыстальнік А зараз
дададзена аўтар 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

UPDATE: Гэта будзе працаваць, калі групоўка па днях: Выкарыстоўваючы выбар год з [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
дададзена

Вы можаце выкарыстоўваць DENSE_RANK , як у наступным SQL заяву

  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
дададзена

Пры выкарыстанні з гальштукамі працаваць у SQL серверы

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 чакае 2 шэрагу, а не 1.
дададзена аўтар Larnu, крыніца
Пад рэдакцыяй пасля ОП ўдакладненняў.
дададзена аўтар 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
дададзена