Как выбрать одну строку для каждого уникального идентификатора - PullRequest
1 голос
/ 14 апреля 2020

SQL новичок здесь учится на работе, все еще зеленый рог. У меня есть проблема, которую я не знаю, как преодолеть. Использование IBM Netezza и Aginity Workbench.

Мой текущий вывод будет пытаться вернуть одну строку для каждого номера дела в зависимости от того, когда была создана задача. Это будет только держать ряд с самой новой задачей. Это дает мне около 85% пути туда. Проблема заключается в том, что иногда несколько задач имеют день создания в один и тот же день.

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

Текущий код

SELECT 
     A.PS_CASE_ID AS Case_Number
     ,D.CASE_TASK_TYPE_NM AS Task
     ,C.TASK_CRTE_TMS
     ,C.TASK_FLWUP_DT AS Task_Followup_Date


FROM VW_CC_CASE A
     INNER JOIN VW_CASE_TASK C ON (A.CASE_ID = C.CASE_ID)
     INNER JOIN VW_CASE_TASK_TYPE D ON (C.CASE_TASK_TYPE_ID = D.CASE_TASK_TYPE_ID)
     INNER JOIN ADMIN.VW_RSN_CTGY B ON (A.RSN_CTGY_ID = B.RSN_CTGY_ID)


WHERE 
     (A.PS_Z_SPSR_ID LIKE '%EFT' OR A.PS_Z_SPSR_ID LIKE '%CRDT')
     AND CAST(A.CASE_CRTE_TMS AS DATE) >= '2020-01-01'
     AND B.RSN_CTGY_NM = 'Chargeback Initiation'
     AND CAST(C.TASK_CRTE_TMS AS DATE) = (SELECT MAX(CAST(C2.TASK_CRTE_TMS AS DATE)) from VW_CASE_TASK C2 WHERE C2.CASE_ID = C.CASE_ID)


GROUP BY 
     A.PS_CASE_ID
     ,D.CASE_TASK_TYPE_NM
     ,C.TASK_CRTE_TMS
     ,C.TASK_FLWUP_DT

Текущий вывод

Current output

Желаемый выход

Desired output

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Вы можете использовать ROW_NUMBER здесь:

WITH cte AS (
    SELECT DISTINCT A.PS_CASE_ID AS Case_Number, D.CASE_TASK_TYPE_NM AS Task,
        C.TASK_CRTE_TMS, C.TASK_FLWUP_DT AS Task_Followup_Date,
        ROW_NUMBER() OVER (PARTITION BY A.PS_CASE_ID ORDER BY C.TASK_FLWUP_DT DESC) rn
    FROM VW_CC_CASE A
    INNER JOIN VW_CASE_TASK C ON A.CASE_ID = C.CASE_ID
    INNER JOIN VW_CASE_TASK_TYPE D ON C.CASE_TASK_TYPE_ID = D.CASE_TASK_TYPE_ID
    INNER JOIN ADMIN.VW_RSN_CTGY B ON A.RSN_CTGY_ID = B.RSN_CTGY_ID
    WHERE (A.PS_Z_SPSR_ID LIKE '%EFT' OR A.PS_Z_SPSR_ID LIKE '%CRDT') AND
          CAST(A.CASE_CRTE_TMS AS DATE) >= '2020-01-01' AND
          B.RSN_CTGY_NM = 'Chargeback Initiation' AND
          CAST(C.TASK_CRTE_TMS AS DATE) = (SELECT MAX(CAST(C2.TASK_CRTE_TMS AS DATE))
                                           FROM VW_CASE_TASK C2
                                           WHERE C2.CASE_ID = C.CASE_ID)
)

SELECT
    Case_Number,
    Task,
    TASK_CRTE_TMS,
    Task_Followup_Date
FROM cte
WHERE rn = 1;
0 голосов
/ 14 апреля 2020

В одном методе используются оконные функции:

with cte as (
      < your query here >
     )
select x.*
from (select cte.*,
             row_number() over (partition by case_number, Task_Followup_Date
                                order by TASK_CRTE_TMS asc
                               ) as seqnum
      from cte
     ) x
where seqnum = 1;
...