Лучший способ сделать то, что я пытаюсь сделать? - PullRequest
0 голосов
/ 31 мая 2018

Я новичок в SQL и мне нужна помощь.Мне нужно отсортировать определенные столбцы в порядке убывания и получить только верхние столбцы.Моя главная проблема - SELECT *, думаю, это может привести к проблемам с производительностью.Другая проблема заключается в том, что этот метод оставляет посторонний столбец ROW_NUMBER, который мне в конечном счете не нужен, но мой SQL-код недействителен, если я не включу этот столбец.

INSERT INTO
  FNL_PROF_BID_ID_W2 ( 
    CUST_ORD_NBR,
    STR_LOC_ID,
    PROF_BID_ID,
    ROW_NUMBER )
SELECT
  *
FROM (
  SELECT
    PB.CUST_ORD_NBR,
    PB.LOC_NBR,
    PB.PROF_BID_ID AS PROF_BID_ID,
    ROW_NUMBER() OVER(PARTITION BY PB.CUST_ORD_NBR, PB.LOC_NBR ORDER BY PB.PROF_BID_ID DESC, PB.CRT_TS DESC) AS ROW_NUMBER
  FROM
    PROF_BID PB )
WHERE
  ROW_NUMBER = 1

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

ROW_NUMBER() - прекрасный способ решить эту проблему.В некоторых случаях вы можете получить более высокую производительность, используя:

INSERT INTO FNL_PROF_BID_ID_W2 (CUST_ORD_NBR, STR_LOC_ID, PROF_BID_ID)
    SELECT PB.CUST_ORD_NBR, PB.LOC_NBR, PB.PROF_BID_ID
    FROM PROF_BID PB
    WHERE PB.PROF_BID_ID = (SELECT MAX(PB2.PROF_BID_ID)
                            FROM PROF_BID PB
                            WHERE PB2.CUST_ORD_NBR = PB.CUST_ORD_NBR AND PB2.LOC_NBR = PB.LOC_NUMBER
                          );

Это предполагает, что PROF_BID_ID уникален, то есть вам не нужен второй ключ для уникальной идентификации строки (что разумно, учитываясоглашения об именах).

В частности, это может оптимально использовать индекс для (CUST_ORD_NBR, LOC_NUMBER, PROF_BID_ID).

. Следует подчеркнуть, что нет ничего плохого в использовании ROW_NUMBER() для этой цели..

Также может быть достаточно сделать:

INSERT INTO FNL_PROF_BID_ID_W2 (CUST_ORD_NBR, STR_LOC_ID, PROF_BID_ID)
    SELECT PB.CUST_ORD_NBR, PB.LOC_NBR, MAX(PB.PROF_BID_ID)
    FROM PROF_BID PB
    GROUP BY PB.CUST_ORD_NBR, PB.LOC_NBR;
0 голосов
/ 31 мая 2018

Измените определение FNL_PROF_BID_ID_W2, чтобы исключить номер строки

INSERT INTO
  FNL_PROF_BID_ID_W2 ( 
    CUST_ORD_NBR,
    STR_LOC_ID,
    PROF_BID_ID )
SELECT
  CUST_ORD_NBR,
    STR_LOC_ID,
    PROF_BID_ID
FROM (
  SELECT
    PB.CUST_ORD_NBR,
    PB.LOC_NBR,
    PB.PROF_BID_ID AS PROF_BID_ID,
    ROW_NUMBER() OVER(PARTITION BY PB.CUST_ORD_NBR, PB.LOC_NBR ORDER BY PB.PROF_BID_ID DESC, PB.CRT_TS DESC) AS ROW_NUMBER
  FROM
    PROF_BID PB )
WHERE
  ROW_NUMBER = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...