Отримати останній запис дня для користувача в 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 Like:

Id      UserName               CreatedOn
2       A               2018-12-20
1       B               2018-11-20
0
Необхідні додаткові дані вибірки; поточний результат можна отримати з ваших даних, просто використовуючи select * з таблиці, де username = 'A'
додано Автор Lee Mac, джерело
Чому ID 4 не повертається? Оскільки у вас немає значення часу, що визначає, що рядок "більше" нещодавній, 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

ОНОВЛЕННЯ: це буде працювати, якщо групувати по днях: Використовуючи вибір року з [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

0
додано

За допомогою функції TIES в 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
додано
Але ОП очікує 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
додано