Разверните, а также получите рейтинг - PullRequest
1 голос
/ 21 июня 2020

Я пытаюсь написать SQL, который может pivot , а также получить его рейтинг все в одной строке. Не знаю, как.

Пример:

Сверните area, но также получите рейтинг cost (порядок самых дорогих)

table name: aaa

entity_id | entity_type | datetime   | area | cost
----------+-------------+------+-----+------+-----
123       | ITEM        | 2020-01-01 | US   | 8
123       | ITEM        | 2020-01-01 | AP   | 7
123       | ITEM        | 2020-01-01 | EU   | 6
123       | ITEM        | 2020-01-02 | US   | 1
123       | ITEM        | 2020-01-02 | AP   | 2
123       | ITEM        | 2020-01-02 | EU   | 3
888       | BOX         | 2020-01-01 | US   | 8
888       | BOX         | 2020-01-01 | AP   | 7
888       | BOX         | 2020-01-01 | EU   | 6
888       | BOX         | 2020-01-02 | US   | 1
888       | BOX         | 2020-01-02 | AP   | 2
888       | BOX         | 2020-01-02 | EU   | 3

Что я want is:

entity_id | entity_type | datetime   | US | AP | EU | US_rank | AP_rank | EU_rank
----------+-------------+------------+----+----+----+---------+---------+---------
123       | ITEM        | 2020-01-01 | 8  | 7  | 6  | 1       | 2       | 3
123       | ITEM        | 2020-01-02 | 8  | 7  | 6  | 3       | 2       | 1
888       | BOX         | 2020-01-01 | 8  | 7  | 6  | 1       | 2       | 3
888       | BOX         | 2020-01-02 | 8  | 7  | 6  | 3       | 2       | 1

В настоящее время я знаю только, как повернуть. Не знаю, как получить «ранжирующую» часть

SELECT  
  p.entity_id, p.entity_type, p.[datetime], p.[US], p.[AP], p.[EU]
FROM
  aaa as a
PIVOT
(
  MAX(cost)
  FOR area IN ([US], [AP], [EU])
) p

(which returns)

entity_id | entity_type | datetime   | US | AP | EU 
----------+-------------+------------+----+----+----
123       | ITEM        | 2020-01-01 | 8  | 7  | 6  
123       | ITEM        | 2020-01-02 | 8  | 7  | 6  
888       | BOX         | 2020-01-01 | 8  | 7  | 6  
888       | BOX         | 2020-01-02 | 8  | 7  | 6  

Я предполагаю, что мне нужно добавить это где-нибудь перед поворотом, но не уверен, что делать после этого

ranking = ROW_NUMBER() OVER(PARTITION BY entity_id, entity_type, [datetime] ORDER BY cost DESC)

(I не против использовать RANK или ROW_NUMBER для этой задачи)

1 Ответ

3 голосов
/ 21 июня 2020

Использовать условное агрегирование:

select entity_id, entity_type, datetime,
       max(case when area = 'US' then cost end) as us,
       max(case when area = 'AP' then cost end) as ap,
       max(case when area = 'EU' then cost end) as eu,
       max(case when area = 'US' then rnk end) as us_rank,
       max(case when area = 'AP' then rnk end) as ap_rank,
       max(case when area = 'EU' then rnk end) as eu_rank
from (select s.*,
             rank() over (partition by entity_id, entity_type, datetime 
                          order by cost desc
                         ) as rnk
      from aaa a
     ) a
group by entity_id, entity_type, datetime 
...