2017-02-13 1 views
0

상상 다음 표어떻게 분의 ID가 각 그룹에 날짜를 생성

선택할 수 있습니다

티켓 표

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

UserEntry의 표는 행의 ID를 얻을 수있는 방법 그래서

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

최소 날짜 값을 가진 각 그룹당

내 예상 답변은 LD는

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

UPDATE처럼 : 나는 다음 질의에서 솔루션을 가지고

CCUserEntry GROUP BY FROM) IN datecreated (MIN을 선택합니다 (datecreated UserEntry FROM

SELECT ID ticket_id)

개선 된 답변 R

(TICKET_ID, datecreated) IN는 (TICKET_ID BY UserEntry 군으로부터, MIN을 (datecreated) TICKET_ID SELECT) UserEntry FROM

SELECT ID;

또한 이것이 좋은 및 정답도 (참고 :. ON DISTINCT 은 SQL 표준의 일부가 아닌)

SELECT DISTINCT ON (ue.ticket_id) ue.ticket_id BY UserEntry UE 순서와 ue.id 는, 당신이 실리 할 것

+0

도와 드리겠습니다 - 구조, 샘플 데이터 및 그 결과를 공유하십시오. – Mureinik

+0

행운을 빌어 요 "모든 데이터베이스 엔진에서 작동"부분을 참조하십시오.) – Andomar

+0

@Andomar 편집 내용을 보았지만 편집 한 내용이 이미 편집 되었기 때문에 어쨌든 UR 도움을 주셔서 감사합니다. –

답변

1

을 ue.datecreated ID는 최소 datecreated입니다. 간단합니다. 최소 날짜를 선택한 다음이 날짜와 일치하는 ID를 선택하십시오.

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

당신이 관계를 가지고 있지 않거나 어쨌든 한 행과 좋은 경우에, 당신은 또한 불행하게도 PostgreSQL을에 넥타이 조항이없는 FETCH FIRST ROW ONLY을 사용할 수 있습니다 확신합니다.

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

UPDATE : 당신은 티켓 당 최소 날짜에 대한 항목의 ID를 원한다. 티켓 당 1 행은 SQL에서 GROUP BY ticket_id으로 변환됩니다.

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, idSELECT id에 당신이 티켓 ID를 표시하지 않도록 쿼리를 원하는 경우, 만들 것이다 열심히 결과는 (두 개 이상의 티켓을 걱정하는 경우) 당신은 fetch first row only 또는 distinct on을 할 수 있습니다

+0

나는 각 그룹에서 최소 ID를 선택하고 싶다. 예를 들어 2의 그룹이있는 경우 최소 ID의 ID 만 선택하고 싶다. –

+0

티켓 당 최소 날짜의 항목 ID를 의미합니까? –

+0

예 :) 티켓 당 min createdDate가있는 각 행 ID –

3

:-) 물론 이해하기 :

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

그러면 date_created 값의 행에 id이 표시됩니다.

+0

티켓 당 ** MIN (datecreated) *가있는 행의 ID를 원한다면 ** GROUP BY **를 사용해야 함 –

+0

@ mibrahim.iti : 쿼리가 나에게 맞아 보인다. . 너도 해봤 니? PostgreSQL의'DISTINCT ON'이 무엇을하는지 알고 있습니까? –

+0

@ThorstenKettner 네,하지만 저와 함께 작동하지 않았습니다. 정확한지 알고 있지만, 작동하지 않습니다. 어쨌든 postgres에 대한 DISTINCT입니다. –

0

modern SQL 창 기능을 사용하는 것입니다 지원 DBMS의 넓은 범위에서 작동 ANSI의 SQL있는 솔루션 : 포스트 그레스에, distinct on()를 사용 고든의 솔루션은 일반적으로 빠른 윈도우 함수

를 사용하여 다음 것을

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

관련 문제