2017-02-13 3 views
0

Imagine Следующие таблицыКак я могу выбрать только идентификатор мин создал дату в каждой группе

Таблица билетов

======================== 
| id | question   | 
======================== 
| 1 | Can u help me :)? | 
======================== 

UserEntry Таблица

====================================================== 
| id | answer    | dateCreated | ticket_id | 
====================================================== 
| 2 | It's my plessure :)? | 2016-08-05 |  1  |  
======================================================= 
| 3 | How can i help u ? | 2016-08-06 |  1  | 
====================================================== 

Так как я могу получить только идентификатор строки для каждой группы, которые имеют минимальное значение даты

Итак, мой ожидаемый ответ shou ЛД быть, как этот

==== 
| id | 
==== 
| 2 | 
==== 

UPDATE:

Я получил решение в следующем запросе

SELECT, идентификатор из UserEntry ГДЕ datecreated IN (SELECT MIN (datecreated) ОТ CCUserEntry GROUP BY ticket_id)

Улучшенный Answe г

SELECT, идентификатор из UserEntry ГДЕ (TICKET_ID, datecreated) В (SELECT TICKET_ID, MIN (datecreated) ОТ UserEntry GROUP BY TICKET_ID);

Кроме того, это хороший и правильный ответ слишком (Примечание:. DISTINCT ON не является частью стандарта SQL)

SELECT DISTINCT ON (ue.ticket_id) ue.id ОТ UserEntry Ue ORDER BY ue.ticket_id, ue.datecreated

+0

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

+0

Удачи вам в работе над работами по всем моделям баз данных;) – Andomar

+0

@Andomar Я видел ваши изменения, но я уже был отредактирован, что сделал, поэтому почему я не принял ваши изменения, так или иначе спасибо за помощь ур :) –

ответ

1

кажется, что вы хотите Селе ct ID с минимальным datecreated. Это просто: выберите минимальную дату и затем выберите идентификаторы, соответствующие этой дате.

SELECT id FROM UserEntry WHERE datecreated = (SELECT MIN(datecreated) FROM UserEntry); 

Если вы уверены, что не будете иметь связей или, если вы хорошо с только один рядом в любом случае, вы можете также использовать FETCH FIRST ROW ONLY, который не имеет пункта связующего в PostgreSQL, к сожалению.

SELECT id FROM UserEntry ORDER BY datecreated FETCH FIRST ROW ONLY; 

UPDATE: Вы хотите идентификатор записи для минимальной даты на билете. За билет переводится в GROUP BY ticket_id в SQL.

SELECT ticket_id, id FROM UserEntry WHERE (ticket_id, datecreated) IN 
    (SELECT ticket_id, MIN(datecreated) FROM UserEntry GROUP BY ticket_id); 

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

SELECT ticket_id, id 
FROM 
(
    SELECT ticket_id, id, RANK() OVER (PARTITION BY ticket_id ORDER BY datecreated) AS rnk 
    FROM UserEntry 
) ranked 
WHERE rnk = 1; 

(Изменить SELECT ticket_id, id в SELECT id, если вы хотите, чтобы запросы не показывать билет ID, который бы результаты труднее понять, конечно :-)

+0

Я хочу выбрать минимальный идентификатор в каждой группе, так, например, если у меня есть группа из 2, я хочу выбрать только идентификатор минимальной даты, получил меня? –

+0

Вы имеете в виду идентификатор записи на минимальную дату за билет? –

+0

да точно :) каждая строка id, у которой есть min createdDate за билеты –

3

вы можете fetch first row only или distinct on (если вы заботитесь о более чем один билет):

SELECT DISTINCT ON (ue.ticket_id) ue.id 
FROM UserEntry ue 
ORDER BY ue.ticket_id, ue.date_created 

Это приведет к появлению id в строке с минимальным значением date_created.

+0

запрос должен использовать ** GROUP BY **, потому что я хочу идентификатор строки, который имеет * MIN (с датой) * для каждой группы (я хочу сгруппировать по билетам) за билет –

+0

@ mibrahim.iti: запрос выглядит правильно для меня , Вы даже пробовали? Вы знаете, что делает PostgreSQL 'DISTINCT ON'? –

+0

@ThorstenKettner да, но не работает со мной, я также вижу, что это правильно, но это не работает, во всяком случае это просто DISTINCT для postgres –

0

Решение с ANSI SQL, который работает в широком диапазоне СУБД, которые поддерживают modern SQL является использование оконных функций:

select id 
from (
    select id, row_number() over (partition by ticket_id order by date_created) as rn 
    from userentry 
) t 
where rn = 1; 

Обратите внимание, что в Postgres, решение Гордона с помощью distinct on() обычно быстрее, чем с помощью окна функции

 Смежные вопросы

  • Нет связанных вопросов^_^