SQL группа по проблеме - PullRequest
       34

SQL группа по проблеме

5 голосов
/ 02 июня 2009

У меня есть запрос, который выполняет несколько объединений и имеет несколько критериев в предложении WHERE, и в итоге я получаю результат, который по сути выглядит следующим образом:

| userId |       date |  otherData |
|--------+------------+------------|
|      1 | 2008-01-01 |  different |
|      1 | 2009-01-01 |       info |
|      1 | 2010-01-01 |        for |
|      2 | 2008-01-01 |       each |
|      3 | 2008-01-01 |        row |
|      3 | 2009-01-01 |       here |

Таким образом, по сути для каждого пользователя будет одна или несколько дат в прошлом и 0 или более дат в будущем.

Мне нужно как-то уменьшить набор данных до одной строки на пользователя, выбрать только строку, в которой дата последнего прохождения прошла . То есть при любом добавлении предложения GROUP BY или HAVING результат, приведенный выше, будет выглядеть следующим образом:

| userId |       date |  otherData |
|--------+------------+------------|
|      1 | 2009-01-01 |       info |
|      2 | 2008-01-01 |       each |
|      3 | 2009-01-01 |       here |

Ответы [ 4 ]

5 голосов
/ 02 июня 2009

Я думаю, что вы не хотите использовать GROUP BY / HAVING, потому что вас интересует ровно 1 строка на пользователя, и эта строка уже существует в таблице как есть. Это требует предложения WHERE, а не GROUP BY / HAVING.

Мое предложение заключается в том, что в предложении WHERE вы добавляете условие, что дата должна быть равна результату подзапроса. Этот подзапрос должен:

  1. Выберите максимум (дата)
  2. Иметь предложение WHERE, ограничивающее дату меньше NOW
  3. иметь предложение WHERE с идентификатором пользователя, равным идентификатору пользователя внешнего запроса

Чтобы предотвратить случаи, когда у определенного пользователя могут быть две записи с одинаковой датой, которая также является максимальной «пройденной» датой, вы также должны добавить DISTINCT.

Надеюсь, это поможет.

0 голосов
/ 02 июня 2009
select T.userid, T.date, T.otherdata 
from 
    T, 
    (select userid, max(date) max_date from T group by userid) GT
where 
    T.userid = GT.userid and T.date = GT.max_date

Пояснение: Внутренний выбор - изолировать только записи с максимальной датой для каждого пользователя. весь выбор - объединить изолированные записи с исходной таблицей, чтобы получить поле других данных.

Я предположил, что для идентификатора пользователя есть только одна максимальная дата. Скажите, пожалуйста, правильное ли это предположение.

0 голосов
/ 02 июня 2009
Select 
  userID, date, otherData 
from 
  yourTable t1
where 
  date = 
    (select max(date) from yourTable t2
     where t1.userID=t2.userID)
0 голосов
/ 02 июня 2009

Как это:

select a.userId, a.date, b.userId, b.otherData
from table1 as a 
left outer join table2 as b on a.userId = b.userId
where b.Id in (
    select top 1 Id from table2 as c where c.userId = a.userId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...