Выберите минимальный Seq Num по ID - PullRequest
1 голос
/ 10 июня 2019

Просто пытаюсь написать простой запрос для получения строки (по VENDOR_ID) с минимальным значением CNTCT_SEQ_NUM, где CONTACT_NAME не является пустым.

Вот что я написал:

SELECT VENDOR_ID, MIN(CNTCT_SEQ_NUM) AS CNTCT_SEQ_NUM , CONTACT_NAME
FROM PS_VENDOR_CNTCT
WHERE VENDOR_ID IN ('ERSUT', 'MOOREA')
AND CONTACT_NAME <> ''
GROUP BY CONTACT_NAME, VENDOR_ID

Текущие результаты:

VENDOR_ID   CNTCT_SEQ_NUM   CONTACT_NAME
ERSUT       19              V Smith
ERSUT       4               T Peterman
ERSUT       2               I GANCE
ERSUT       8               R FISHER
MOOREA      2               S DALY
MOOREA      4               B SLAUTEN
MOOREA      1               N BLAKELY

Ожидаемые результаты будут:

VENDOR_ID   CNTCT_SEQ_NUM   CONTACT_NAME
ERSUT       2               I GANCE
MOOREA      1               N BLAKELY

Ответы [ 3 ]

2 голосов
/ 10 июня 2019

Попробуйте это-

SELECT A.* FROM PS_VENDOR_CNTCT A
INNER JOIN
(
    SELECT VENDOR_ID,MIN(CNTCT_SEQ_NUM) CNTCT_SEQ_NUM
    FROM PS_VENDOR_CNTCT
    GROUP BY VENDOR_ID
)B ON A.VENDOR_ID = B.VENDOR_ID
AND A.CNTCT_SEQ_NUM = B.CNTCT_SEQ_NUM
1 голос
/ 10 июня 2019

Кажется, вам не нужен MIN(), но есть аналитическая функция окна, такая как ROW_NUMBER()

SELECT DISTINCT Q.VENDOR_ID, Q.CONTACT_NAME, Q.CNTCT_SEQ_NUM
  FROM
  (
  SELECT P.*, 
         ROW_NUMBER() OVER 
                     (PARTITION BY VENDOR_ID ORDER BY CNTCT_SEQ_NUM) AS RN
    FROM PS_VENDOR_CNTCT P
   WHERE VENDOR_ID IN ('ERSUT', 'MOOREA')
     AND CONTACT_NAME <> ''     
   ) Q
  WHERE Q.RN = 1
1 голос
/ 10 июня 2019

Коррелированный подзапрос решает это:

select vc.*
from PS_VENDOR_CNTCT vc
where vc.CNTCT_SEQ_NUM = (select min(vc2.CNTCT_SEQ_NUM)
                          from PS_VENDOR_CNTCT vc2
                          where vc2.VENDOR_ID = vc.VENDOR_ID and
                                vc2.CONTACT_NAME <> ''
                         );

Для повышения производительности вы можете попробовать индекс на (VENDOR_ID, CONTACT_NAME, CNTCT_SEQ_NUM). Это относится к подзапросу, хотя все записи индекса по-прежнему необходимо сканировать.

...