有没有办法在不使用分析函数或相关子查询的情况下在 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