SQL-запрос, который выбрасывает строки, которые старше и удовлетворяют условию?

0

Выдающий следующий запрос:

  SELECT t.seq, 
         t.buddyId, 
         t.mode, 
         t.type, 
         t.dtCreated 
    FROM MIM t 
   WHERE t.userId = 'ali' 
ORDER BY t.dtCreated DESC;

... возвращает мне 6 строк.

+-------------+------------------------+------+------+---------------------+
|         seq | buddyId                | mode | type | dtCreated           |
+-------------+------------------------+------+------+---------------------+
|          12 | [email protected] |    2 |    1 | 2009-09-14 12:39:05 |
|          11 | [email protected] |    4 |    1 | 2009-09-14 12:39:02 |
|          10 | [email protected]  |    1 |   -1 | 2009-09-14 12:39:00 |
|           9 | [email protected] |    1 |   -1 | 2009-09-14 12:38:59 |
|           8 | [email protected]  |    2 |    1 | 2009-09-14 12:37:53 |
|           7 | [email protected] |    2 |    1 | 2009-09-14 12:37:46 |
+-------------+------------------------+------+------+---------------------+

Я хочу вернуть строки на основе этого условия:

  • Если есть повторяющиеся строки с тем же buddyId, верните мне последнее (как указано dtCreated).

Итак, запрос должен вернуть мне:

+-------------+------------------------+------+------+---------------------+
|         seq | buddyId                | mode | type | dtCreated           |
+-------------+------------------------+------+------+---------------------+
|          12 | [email protected] |    2 |    1 | 2009-09-14 12:39:05 |
|          10 | [email protected]  |    1 |   -1 | 2009-09-14 12:39:00 |
+-------------+------------------------+------+------+---------------------+

Я пробовал без успеха использовать функцию UNIQUE, но не работает.

Теги:

1 ответ

2
Лучший ответ

Это должно возвращать только самую последнюю запись для каждого пользователя.

SELECT a.seq
     , a.buddyId
     , a.mode
     , a.type
     , a.dtCreated
FROM mim AS [a]
JOIN (SELECT MAX(dtCreated) FROM min GROUP BY buddyId) AS [b]
     ON a.dtCreated = b.dtCreated
     AND a.userId = b.userId
WHERE userId='ali'
ORDER BY dtCreated DESC;
  • 0
    Я знал хитрость с параметром Where userID = (select ....), но он будет запускать подзапрос для каждой строки. Это лучшее решение. +1
  • 0
    @TheVillageIdiot: подзапрос не выполняется для каждой строки в предложении WHERE; SELECT в предложении SELECT (IE: SELECT t.col, (SELECT ...), ...) будет ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню