有没有办法在不使用分析函数或相关子查询的情况下在 sql 中执行排名?
Is there a way to perform a ranking in sql without using either analytic functions or correlated subqueries?
考虑:
select row_number()
over (partition by product_category order by price desc) ARank,*
from Product
现在:不再使用分析函数,例如 _row_number()_ 或 rank() - 并且 不使用相关子查询 有没有办法在标准 sql 中获得相同的结果?
注意:关于如何模拟分析函数有一个很好的问答:。但是,所有答案都使用 相关子查询 .
动机如下:我正在使用基于 SQL 的存储库,除了时间戳列之外不支持分析函数,并且不支持 相关子查询 完全支持:特别是 spark structured streaming 。 其他标准sql构造和函数受到支持:所以问题是关于如何使用remaining/simpler获得这些结果构造(如果它真的可能的话)。
您可以通过将 table 连接到自身来完成此操作,条件是连接的 table 中的价格小于原始价格,然后计算行数在加入table中给出一个排序。例如:
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
中一样(就像我在这个示例查询中所做的那样)。
输出(对于我的demo on 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
考虑:
select row_number()
over (partition by product_category order by price desc) ARank,*
from Product
现在:不再使用分析函数,例如 _row_number()_ 或 rank() - 并且 不使用相关子查询 有没有办法在标准 sql 中获得相同的结果?
注意:关于如何模拟分析函数有一个很好的问答:
动机如下:我正在使用基于 SQL 的存储库,除了时间戳列之外不支持分析函数,并且不支持 相关子查询 完全支持:特别是 spark structured streaming 。 其他标准sql构造和函数受到支持:所以问题是关于如何使用remaining/simpler获得这些结果构造(如果它真的可能的话)。
您可以通过将 table 连接到自身来完成此操作,条件是连接的 table 中的价格小于原始价格,然后计算行数在加入table中给出一个排序。例如:
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
中一样(就像我在这个示例查询中所做的那样)。
输出(对于我的demo on 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