Вернуть запись с самой ранней датой
Я использую Aginity Workbench
с базой данных на Netezza
и я пытаюсь вернуть запись с самой ранней датой на основе IS
код в любом из трех столбцов (исправность). Есть несколько записей для одного ICS_UID
, но я просто хочу вернуть запись, где самое раннее появление этого IS
код.
Ниже приведен код, который я пытался использовать, но, похоже, он возвращает все случаи, когда запись имеет IS
код, а не выбор ICS_UID
в предложении where. Благодарен за любую помощь или совет.
SELECT
ICS _UID, min(MOVEMENT_DATE) as MOVEMENT_DATE, CURRENT_A_SERVICABILITY_CODE, CURRENT_B_SERVICABILITY_CODE,
CURRENT_C_SERVICABILITY_CODE
FROM
HUB_MOVEMENT
WHERE
ICS_UID IN (317517607,317962513,etc,etc…)
AND CURRENT_A_SERVICABILITY_CODE = 'IS' OR CURRENT_B_SERVICABILITY_CODE = 'IS' OR CURRENT_C_SERVICABILITY_CODE = 'IS'
GROUP BY
ICS_UID, CURRENT_A_SERVICABILITY_CODE,
CURRENT_B_SERVICABILITY_CODE,
CURRENT_C_SERVICABILITY_CODE;
1 ответ
Решение
Не использовать GROUP BY
, Если вы хотите одну запись, то:
SELECT m.*
FROM HUB_MOVEMENT m
WHERE ICS_UID IN (317517607,317962513,etc,etc…) AND
'IS' IN (CURRENT_A_SERVICABILITY_CODE, CURRENT_B_SERVICABILITY_CODE , CURRENT_C_SERVICABILITY_CODE)
ORDER BY MOVEMENT_DATE
LIMIT 1;
Если вы хотите одну строку в ICS_UID
тогда вы можете использовать ROW_NUMBER()
:
SELECT m.*
FROM (SELECT m.*,
ROW_NUMBER() OVER (PARTITION BY ICS_UID ORDER BY MOVEMENT_DATE) as seqnum
FROM HUB_MOVEMENT m
WHERE ICS_UID IN (317517607,317962513,etc,etc…) AND
'IS' IN (CURRENT_A_SERVICABILITY_CODE, CURRENT_B_SERVICABILITY_CODE , CURRENT_C_SERVICABILITY_CODE)
) m
WHERE seqnum = 1;