Есть ли способ выполнить ранжирование в SQL без использования аналитических функций или коррелированных подзапросов? - PullRequest
0 голосов
/ 21 апреля 2019

Рассмотрим:

select row_number() 
  over (partition by product_category order by price desc) ARank,* 
  from Product

Теперь: вместо использования аналитической функции, такой как _row_number () _ или rank () - и без использования коррелированных подзапросов Есть ли способ получить те же результаты в стандартном SQL?

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

. Мотивация следующая: я использую репозиторий на основе SQL, для которого не поддерживаются аналитические функции, кроме столбцов с метками времени и для которых коррелированные подзапросы вообще не поддерживаются: в частности потоковая структурированная искра . Другие стандартные конструкции и функции sql поддерживаются : поэтому вопрос заключается в том, как получить эти результаты с помощью оставшихся / более простых конструкций (если это вообще возможно).

1 Ответ

2 голосов
/ 21 апреля 2019

Вы можете сделать это, присоединив таблицу к себе, с условием, что цена в объединенной таблице будет меньше, чем цена в оригинале, а затем посчитать количество строк в объединенной таблице, чтобы создать порядок.Например:

SELECT p1.product_category, p1.name, p1.price, COUNT(*) AS row_number
FROM Product p1
JOIN Product p2 ON p2.product_category = p1.product_category AND p2.price <= p1.price
GROUP BY p1.product_category, p1.price, p1.name
ORDER BY p1.product_category, row_number

Обратите внимание, что если включен режим only_full_group_by, необходимо включить все поля в предложении GROUP BY, как и в SELECT (как я сделал для этого примера запроса).

Вывод (для моей демонстрации на dbfiddle ):

product_category    name    price   row_number
clothing            tie     20.00   1
clothing            shirt   35.99   2
clothing            coat    55.20   3
furniture           chair   20.50   1
furniture           table   108.00  2
furniture           sofa    134.00  3
furniture           bed     220.00  4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...