Reputation: 4815
I have written a query and here below I mentioned.
SELECT P.PERSON_ID,
P.BIRTH_DATE,
P.GENDER_CODE,
LISTAGG(R.RACE_CODE, ',') WITHIN GROUP(ORDER BY R.RACE_CODE) AS RACE_CODE,
P.HISPANIC_LATINO_CODE,
C.CLINICALLY_DIAGNOSED_CODE,
LISTAGG(C.CHARACTERISTIC_CODE, ',') WITHIN GROUP(ORDER BY C.CHARACTERISTIC_CODE) AS CHARA_CODES,
P.PREV_ADOPTED_CODE,
P.AGE_ADOPTED,
PE.REMOVED_DATE
FROM PERSON P
LEFT OUTER JOIN RACE R
ON P.PERSON_ID = R.PERSON_ID
LEFT OUTER JOIN CHARACTERISTIC C
ON C.PERSON_ID = P.PERSON_ID
LEFT OUTER JOIN PLACEMENT_EPISODE PE
ON P.PERSON_ID = PE.CHILD_ID
GROUP BY P.PERSON_ID,
P.BIRTH_DATE,
P.GENDER_CODE,
P.HISPANIC_LATINO_CODE,
C.CLINICALLY_DIAGNOSED_CODE,
P.PREV_ADOPTED_CODE,
P.AGE_ADOPTED,
PE.REMOVED_DATE
Here, I want to change my query so that it will retrieve only first value for pe.removed_date.
I read about FIRST() function here. But I am not able to change my query to use FIRST() function.
Suppose PERSON table holds person_id's 1,2,3... And PLACEMENT_EPISODE holds values like:
person_id removed_date
1 d1_1
2 d2_1
1 d1_2
3 d3_1
2 d2_2
1 d1_3
So i want:
person_id removed_date
1 d1_1
2 d2_1
3 d3_1
child_id from PLACEMENT_EPISODE table is foreign key references Primary key person_id from PERSON table.
Upvotes: 1
Views: 2072
Reputation: 477
You can use ROW_NUMBER() OVER (PARTITION BY..
to get order number by specified clause. Wrap your statement with select * from
Then use that order number in its where clause like in this SQL:
select * from (
SELECT P.PERSON_ID,
P.BIRTH_DATE,
P.GENDER_CODE,
LISTAGG(R.RACE_CODE, ',') WITHIN GROUP(ORDER BY R.RACE_CODE) AS RACE_CODE,
P.HISPANIC_LATINO_CODE,
C.CLINICALLY_DIAGNOSED_CODE,
LISTAGG(C.CHARACTERISTIC_CODE, ',') WITHIN GROUP(ORDER BY C.CHARACTERISTIC_CODE) AS CHARA_CODES,
P.PREV_ADOPTED_CODE,
P.AGE_ADOPTED,
PE.REMOVED_DATE,
ROW_NUMBER() OVER (PARTITION BY P.PERSON_ID ORDER BY PE.REMOVED_DATE ASC) AS order_num
FROM PERSON P
LEFT OUTER JOIN RACE R
ON P.PERSON_ID = R.PERSON_ID
LEFT OUTER JOIN CHARACTERISTIC C
ON C.PERSON_ID = P.PERSON_ID
LEFT OUTER JOIN PLACEMENT_EPISODE PE
ON P.PERSON_ID = PE.CHILD_ID
GROUP BY P.PERSON_ID,
P.BIRTH_DATE,
P.GENDER_CODE,
P.HISPANIC_LATINO_CODE,
C.CLINICALLY_DIAGNOSED_CODE,
P.PREV_ADOPTED_CODE,
P.AGE_ADOPTED,
PE.REMOVED_DATE
) WHERE order_num=1
Upvotes: 1
Reputation: 4844
If you want just a first selected row you can use rownum.
SELECT DISTINCT P.PERSON_ID,
P.BIRTH_DATE,
P.GENDER_CODE,
LISTAGG(R.RACE_CODE, ',') WITHIN GROUP(ORDER BY R.RACE_CODE) AS RACE_CODE,
P.HISPANIC_LATINO_CODE,
C.CLINICALLY_DIAGNOSED_CODE,
LISTAGG(C.CHARACTERISTIC_CODE, ',') WITHIN GROUP(ORDER BY C.CHARACTERISTIC_CODE) AS CHARA_CODES,
P.PREV_ADOPTED_CODE,
P.AGE_ADOPTED,
PE.REMOVED_DATE
FROM PERSON P
LEFT OUTER JOIN RACE R
ON P.PERSON_ID = R.PERSON_ID
LEFT OUTER JOIN CHARACTERISTIC C
ON C.PERSON_ID = P.PERSON_ID
LEFT OUTER JOIN PLACEMENT_EPISODE PE
ON P.PERSON_ID = PE.CHILD_ID
WHERE ROWNUM = 1;
GROUP BY P.PERSON_ID,
P.BIRTH_DATE,
P.GENDER_CODE,
P.HISPANIC_LATINO_CODE,
C.CLINICALLY_DIAGNOSED_CODE,
P.PREV_ADOPTED_CODE,
P.AGE_ADOPTED,
PE.REMOVED_DATE
Upvotes: 0