2012-01-27 2 views
1

Это моя (упрощенный) таблица:SQL запрос, чтобы получить только одно вхождение для каждого идентификатора

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, мне нужно только одно вхождение ,

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

+1

Какое событие должно быть возвращено? Первая/последняя/не занятая? –

+0

Пожалуйста, включите в свой вопрос, на что вы хотите, чтобы ваш результат выглядел. Кроме того, если вы можете указать название своей таблицы, это поможет нам предоставить ответ, который вам подходит. –

ответ

2

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

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

спасибо, человек, второй работал для меня! :) –

4

Попробуйте агрегирование с 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 
+0

Благодарю вас за ответ, но он не работает :(Он извлекает только одну строку с минимальным значением eventStart –

+0

@Alessandro, вы уверены, что он просто извлекает одну строку? Я пробовал несколько раз, и он возвращает 3 строки. я добавил результат, который я получаю до моего ответа. –

0

вы можете получить более раннюю дату для каждого seriesKey:

select * from 
(
select seriesKey, min(eventStart) as mindate 
group by seriesKey 
) 
order by mindate 
Смежные вопросы