SQL бағдарламасындағы пайдаланушыға арналған ең соңғы жазба алу

Бір күнде бірдей кестедегі сол пайдаланушының бірнеше жазбалары бар болса, пайдаланушыға күннің соңғы жазбасын алу.

Мысалға:

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

Мен нәтиже алғым келеді User A, B сияқты:

Id      UserName               CreatedOn
2       A               2018-12-20
1       B               2018-11-20
0
Үлгідегі деректер қажет; Сіздің ағымдағы нәтижеңізді тек таңдап * кестеден табуға болатын деректерден алуға болады, онда username = 'A'
қосылды автор Lee Mac, көзі
Неліктен ID 4 қайтарылмайды? Уақытша мәніңіз болмағандықтан, жолдың жақсырақ болғанын анықтайтын нені білдіреді, ID мәні жоғары ма? ( ID мәні үлкенірек болып табылатындығын ескерсек, бұл имайла дегенді білдіреді, бұл санның неғұрлым төмен екендігін білдіреді.)
қосылды автор Larnu, көзі
Сіздің соңғы редакцияңыз тек қана нәрсені шатастырады. «күнделікті кестеде бір пайдаланушы бірнеше Пайдаланушының кіруі бар болса, күн сайын ең соңғы жазбаны қалай алуға болады?» . Сонымен, деректеріңізге негізделгенде, үлгі деректеріңіздегі әрбір жол қайтарылуы керек. Олар сол күні барлық «соңғы» жолды білдіреді, себебі ешбір пайдаланушының бірдей күнінде бірнеше жазбалары болмайды.
қосылды автор Larnu, көзі
@Ларну, менің түсінуімше, қазір күн санының маңыздылығына байланысты, ол жай ғана күн/күннің соңғы рекордын алғысы келеді.
қосылды автор affanBajwa, көзі
Мен қазіргі уақытта User User іздеймін
қосылды автор 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;

Рекстестер Демо

0
қосылды

Sql серверінде WITH 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
қосылды
Бірақ ОП 2 жолды күтеді, 1 емес.
қосылды автор 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
қосылды