SQL-запрос для последней даты / времени, отметка для каждого идентификатора - PullRequest
0 голосов
/ 09 декабря 2018

Помогите, пожалуйста, отсортировать список ниже ТАБЛИЦА,

ID NAME DATE TIME STATUS

Идентификатор уникален, имя, дата, время, статус постоянно меняется в базе данных.

Мне нужен список вывода, имеющий Последние штампы СОСТОЯНИЕ, ДАТА И ВРЕМЯ для каждого идентификатора пользователя

image

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

Как насчет

SELECT T1.*
FROM T T1 INNER JOIN
    (
        SELECT ID,
               CName,
               MAX(CDate) CDate,
               MAX(CTime) CTime
        FROM T
        GROUP BY ID,
                 CName
    ) T2 
ON T1.CDate = T2.CDate 
   AND 
   T1.CTime = T2.CTime 
   AND T1.CName = T2.CName;

Который вернется

+---------------------+----------+--------+----+-------+
|        CDate        |  CTime   | Status | ID | CName |
+---------------------+----------+--------+----+-------+
| 22/12/2018 00:00:00 | 16:27:57 |      1 |  1 | A     |
| 21/12/2018 00:00:00 | 15:41:13 |      4 |  2 | B     |
| 20/12/2018 00:00:00 | 12:35:27 |      3 |  2 | C     |
| 21/12/2018 00:00:00 | 15:29:46 |      4 |  3 | D     |
+---------------------+----------+--------+----+-------+

ИЛИ

SELECT T1.*
FROM T T1 INNER JOIN
    (
        SELECT ID,
               MAX(CDate) CDate,
               MAX(CTime) CTime
        FROM T
        GROUP BY ID
    ) T2 
ON T1.CDate = T2.CDate 
   AND 
   T1.CTime = T2.CTime;

Который вернется

+---------------------+----------+--------+----+-------+
|        CDate        |  CTime   | Status | ID | CName |
+---------------------+----------+--------+----+-------+
| 22/12/2018 00:00:00 | 16:27:57 |      1 |  1 | A     |
| 21/12/2018 00:00:00 | 15:41:13 |      4 |  2 | B     |
| 21/12/2018 00:00:00 | 15:29:46 |      4 |  3 | D     |
+---------------------+----------+--------+----+-------+

Демо

0 голосов
/ 09 декабря 2018

Я бы использовал для этого оконные функции:

select t.*
from (select t.*,
             row_number() over (partition by id order by date desc, time desc) as seqnum
      from t
     ) t
where seqnum = 1;

В качестве альтернативы, если у вас есть таблица с одной строкой для каждого клиента, тогда лучше всего будет apply:

select t.*
from customers c cross apply
     (select top (1) t.*
      from t
      where t.id = c.id
      order by date desc, time desc
     ) t;
0 голосов
/ 09 декабря 2018
SELECT * FROM table
WHERE C_Time = 
  (SELECT max(C_Time) FROM table t1 WHERE C_Date = 
    (SELECT max(C_Date) FROM table t2 WHERE t1.ID = t2.ID)
  );

Это дает вам записи для самых высоких значений C_Date и C_Time для каждого ID

...