Захватите одну запись для каждого идентификатора с несколькими значениями Lead - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть такая таблица:

 ID |  Val   |  Quantity
----------------------
 1  |   A    |   11
 1  |   B    |   15
 1  |   B    |   19
 1  |   Z    |   45
 2  |   D    |   4
 2  |   E    |   25
 2  |   F    |   13
 2  |   Y    |   2
 3  |   G    |   10
 3  |   H    |   15
 3  |   I    |   19

Я хочу выбрать верхнюю запись для каждого идентификатора, упорядоченного по VAL, Количество И добавить следующие 2 значения Val / Количество в сортировке в виде столбцов для этой строки , Мой ожидаемый результат выглядит следующим образом:

 ID |  Val   |  Quantity  | VAL2  | Quantity2 | VAL3  | Quantity3
-------------------------------------------------------------------
 1  |   A    |   11       |  B    |   15      |   B   |    19
 2  |   B    |   15       |  D    |   4       |   E   |    25
 3  |   C    |   19       |  G    |   10      |   H   |    15

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

SELECT ID,
       VAL,
       Quantity,
      lead(VAL,1) over (order by VAL, Quantity ASC) as Val2,       
      lead(Quantity,1) over (order by VAL, Quantity ASC) as Quantity2, 
      lead(VAL,2) over (order by VAL, Quantity ASC) as Val3,       
      lead(Quantity,2) over (order by VAL, Quantity ASC) as Quantity3,   
FROM MY_TABLE
order by VAL, Quantity ASC

Как я могу выбрать только верхнюю запись для каждого идентификатора, сохраняя ведущие записи? Или есть более элегантный / эффективный способ сделать это?

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Судя по вашему вопросу, ожидаемый результат на самом деле должен быть:

ID  VAL     QUANTITY    VAL2    QUANTITY2   VAL3    QUANTITY3
1   A       11          B       15          B       19
2   D       4           E       25          F       13
3   G       10          H       15          I       19

Этот результат можно получить с помощью CTE, который генерирует значения LEAD, а также ROW_NUMBER для каждого набора ценностей. Затем вы можете выбрать первую строку для каждого ID из CTE:

WITH CTE AS (
  SELECT ID,
         Val, Quantity,
         LEAD(Val) OVER (PARTITION BY ID ORDER BY Val, Quantity) AS Val2,
         LEAD(Quantity) OVER (PARTITION BY ID ORDER BY Val, Quantity) AS Quantity2,
         LEAD(Val, 2) OVER (PARTITION BY ID ORDER BY Val, Quantity) AS Val3,
         LEAD(Quantity, 2) OVER (PARTITION BY ID ORDER BY Val, Quantity) AS Quantity3,
         ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Val, Quantity) AS rn
  FROM MY_TABLE
) 
SELECT ID, Val, Quantity, Val2, Quantity2, Val3, Quantity3
FROM CTE
WHERE rn = 1

Демонстрация по SQLFiddle

0 голосов
/ 18 апреля 2020

Вы можете использовать ROW_NUMBER, чтобы определить порядок строк в одном и том же ID

with t as (
select ID, VAL, QUANTITY,
row_number() over (partition by ID order by VAL, QUANTITY) as rn
from tab)
select * 

        ID V   QUANTITY         RN
---------- - ---------- ----------
         1 A         11          1
         1 B         15          2
         1 B         19          3
         1 Z         45          4
         2 D          4          1
...

На следующем шаге используйте PIVOT чтобы получить лучшие три значения в одной строке.

with t as (
select ID, VAL, QUANTITY,
row_number() over (partition by ID order by VAL, QUANTITY) as rn
from tab)
select * 
from t
PIVOT
(MAX(VAL) as VAL, MAX(QUANTITY) as QUANTITY FOR RN IN (1 as "COL1" ,2 as "COL2",3 as "COL3") 
)

        ID C COL1_QUANTITY C COL2_QUANTITY C COL3_QUANTITY
---------- - ------------- - ------------- - -------------
         1 A            11 B            15 B            19
         2 D             4 E            25 F            13
         3 G            10 H            15 I            19

Если стандартное именование столбцов сводной таблицы не подходит, просто добавьте следующий запрос и переименуйте столбцы.

Обратите внимание, что этот запрос вернуть тот же результат, что и в альтернативном подходе, для нескольких столбцов LEAD, но вы получите немного большую гибкость, если планируете изменять количество отслеживаемых столбцов .

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