SQL-запрос для получения только одного вхождения для каждого идентификатора - PullRequest
1 голос
/ 27 января 2012

Это моя (упрощенная) таблица:

id     eventName       seriesKey    eventStart
1      Event1          5000         2012-01-01 14:00:00
2      Event2          5001         2012-01-01 14:30:00
3      Event3          5000         2012-01-01 14:50:00
4      Event4          5002         2012-01-01 14:55:00
5      Event5          5001         2012-01-01 15:00:00
6      Event6          5002         2012-01-01 15:30:00
7      Event7          5002         2012-01-01 16:00:00 

Мне нужно создать запрос, который упорядочит таблицу на eventStart (ASC), но для каждого seriesKey мне нужно только одно вхождение.

Большое спасибо

Ответы [ 3 ]

4 голосов
/ 27 января 2012

Попробуйте агрегировать с GROUP BY и использовать агрегирующие функции, такие как MIN ().

SELECT seriesKey,
       MIN(eventStart) eventStart
FROM   events
GROUP  BY seriesKey;

В результате:

5000    2012-01-01 14:00:00.000
5001    2012-01-01 14:30:00.000
5002    2012-01-01 14:30:00.000

Если вас интересуют все столбцы из таблицы событий, а не только два вышеуказанных столбца, которые я выбрал, в некоторых базах данных (например, SQL Server) есть странная реализация, которая может вам помочь:

SELECT *
FROM   events e1
WHERE  e1.ID IN
(
       SELECT   TOP 1 e2.ID
       FROM     events e2
       WHERE    e2.seriesKey = e1.seriesKey
       ORDER BY e2.eventStart
);

В результате:

1   Event1  5000    2012-01-01 14:00:00.000
2   Event2  5001    2012-01-01 14:30:00.000
6   Event2  5002    2012-01-01 14:30:00.000
2 голосов
/ 27 января 2012

Если вам также нужны другие столбцы, связанные с ключом, у вас есть два варианта:

select *
from (
  select id, 
         eventName, 
         seriesKey,
         eventStart,
         row_number() over (partition by seriesKey order by eventStart) as rn
  from the_event_table
) t
where rn = 1
order by eventStart

или для более старых СУБД, которые не поддерживают оконные функции:

  select t1.id, 
         t1.eventName, 
         t1.seriesKey,
         t1.eventStart
  from the_event_table t1
  where t1.eventStart = (select min(t2.eventStart)
                         from the_event_table t2
                         where t2.seriesKey = t1.seriesKey)
  order by eventStart
0 голосов
/ 27 января 2012

Вы можете получить более раннюю дату для каждой серииКлюч:

select * from 
(
select seriesKey, min(eventStart) as mindate
group by seriesKey
)
order by mindate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...