2015-07-03 3 views
1

Я написал запрос, и здесь ниже я упомянул.Как получить первое значение для столбца в базе данных Oracle?

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 

Здесь я хочу изменить свой запрос так, чтобы он получал только первое значение для pe.removed_date.

Я прочитал о FIRST() функции here. Но я не могу изменить свой запрос на использование функции FIRST().

Пусть таблица PERSON держит person_id 1,2,3-х ... И PLACEMENT_EPISODE имеет значения, как:

person_id removed_date 
    1   d1_1 
    2   d2_1 
    1   d1_2 
    3   d3_1 
    2   d2_2 
    1   d1_3 

Так я хочу:

person_id   removed_date 
    1   d1_1 
    2   d2_1 
    3   d3_1 

child_id из PLACEMENT_EPISODE таблицы внешних ключей ссылки Первичные ключ person_id из таблицы PERSON.

+0

Вы имеете в виду вы хотите, чтобы ограничить вывод одной строки на основе порядка 'pe.removed_date'? –

+0

Для одного человека в таблице place_episode будет много удаленных_данных. Я хочу получить первое значение remove_date из таблицы place_episode для человека – Madhusudan

+0

Вы не ответили на мой вопрос, каков ваш желаемый результат. Введите вход и желаемый выход. Также укажите версию Oracle. –

ответ

0

Если вы хотите только первую выбранную строку, вы можете использовать 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 
+0

Предложение GROUP BY должно быть после предложения where. И я хочу получить первое значение для этого конкретного столбца. ROWNUM = 1 даст мне первую строку всего результирующего набора – Madhusudan

+0

«SELECT * FROM() a где rownum = 1« Внутри барделей добавьте свой запрос. Я не хочу этого делать. –

+0

@ Rushikesh Если запрос прав, то даны правильные значки –

1

Вы можете использовать ROW_NUMBER() OVER (PARTITION BY.., чтобы получить номер заказа по указанному разделу. Оберните заявление с select * from Затем использовать этот порядковый номер в пункте где, как в этом 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 
Смежные вопросы