Я пытаюсь написать 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
для этой задачи)