Возврат 1 строки на человека - PullRequest
0 голосов
/ 05 февраля 2019

Я хочу вернуть 1 строку на человека на основе последнего "APP_START_DT".

Я хочу убедиться, что он смотрит на MAX (APP_START_DT), а затем следует все даты в этом ряду для этого человека и игнорируетостальные строки и даты на нем.

This is what I have tried:
select distinct ap1.ID,
MAX(ap1.APP_START_DT) over (PARTITION by ap1.ID) APP_START_DT,
ap1.APP_SUBMIT_DT
from table1 ap1
where ap1.ID in ('444','555');

Getting 2 rows for both of these ids.



My Table:
ID   NAME    Acct_CR_DT    App_Ap    APP_START_DT    APP_SUBMIT_DT
444  ABC1    9/5/2018      My univ   9/5/2018        9/14/2018
444  ABC1    9/5/2018      {null}    {null}          {null}
555  ABC2    1/9/2019      {null}    {null}          {null}
555  ABC2    1/9/2019      Univ4     1/9/2019        1/9/2019




Desired Results:   
ID     NAME   Acct_CR_DT  App_Ap   APP_START_DT  APP_SUBMIT_DT App_stat
444  ABC1     9/5/2018    My univ  9/5/2018      9/14/2018     Submt
555  ABC2     1/9/2019    Univ4    1/9/2019      1/9/2019      Submt

Ответы [ 5 ]

0 голосов
/ 11 февраля 2019
SELECT *
FROM
(
    SELECT *
    FROM mytable
    WHERE id IN(444, 555)
) T1
INNER JOIN
(
    SELECT id, 
           MAX(APP_START_DT) APP_START_DT
    FROM mytable
    WHERE id IN(444, 555)
    GROUP BY ID
) T2 ON T1.id = T2.ID
        AND T1.APP_START_DT = T2.APP_START_DT;
0 голосов
/ 11 февраля 2019
select * 
FROM table1
where (id, app_start_dt) IN (
    SELECT ap1.ID, MAX(ap1.APP_START_DT)
    FROM table1 ap1
    WHERE ap1.ID in ('444','555')
    GROUP BY ap1.ID 
    )   ;

Хавьер был близко.Я считаю, что это работает, если вы используете его запрос в качестве дополнительного выбора.Было бы неплохо узнать, как выглядят данные и существуют ли дубликаты для какой-либо конкретной даты, поскольку это нарушило бы этот подход.

0 голосов
/ 05 февраля 2019

Вы можете применить нулевую функцию обработки для получения желаемых результатов.

select distinct ap1.ID,
MAX(ap1.APP_START_DT) over (PARTITION by ap1.ID) APP_START_DT,
ap1.APP_SUBMIT_DT
from (select COALESCE(APP_START_DT, 'lowest_date') as APP_START_DT, ID, APP_SUBMIT_ID from table1 where ID in ('444','555')) ap1;
0 голосов
/ 05 февраля 2019

А как насчет FIRST_VALUE / LAST_VALUE (и разделение окон в соответствии с идентификатором пользователя?):

SELECT DISTINCT
    ID, NAME,
    LAST_VALUE(Acct_CR_DT)    OVER(PARTITION BY ID ORDER BY APP_START_DT NULLS FIRST RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
    LAST_VALUE(App_Ap)        OVER(PARTITION BY ID ORDER BY APP_START_DT NULLS FIRST RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
    LAST_VALUE(APP_START_DT)  OVER(PARTITION BY ID ORDER BY APP_START_DT NULLS FIRST RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
    LAST_VALUE(APP_SUBMIT_DT) OVER(PARTITION BY ID ORDER BY APP_START_DT NULLS FIRST RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
  FROM table1 ap1

Для каждой строки мы находим «Последнее значение» каждого столбца для каждой пары идентификатор пользователя / имя.Нам нужен DISTINCT, чтобы удалить дублирующиеся записи, так как это «последнее значение» вычисляется для каждой строки (не только последней в каждой группе).

Если должно работать, если Вы можете гарантировать, будет только одна строкас APP_START_DT = MAX (APP_START_DT) OVER (идентификатор PARTITION BY) или, если таких строк больше, то они, по крайней мере, согласованы для выбранных столбцов.Если Вы не можете гарантировать это, я бы рассмотрел добавление дополнительных столбцов в предложения ORDER BY (какая строка должна быть первой).

0 голосов
/ 05 февраля 2019

Группировка по ap1.ID должна позволять вам получать по одной строке на каждый ID при получении вашего МАКСА APP_START_DT

SELECT distinct ap1.ID, MAX(ap1.APP_START_DT)
FROM table1 ap1
WHERE ap1.ID in ('444','555')
GROUP BY ap1.ID ;
...