Window MySQL 中的函数查询

Window function query in MySQL

我们有 Date、CID、Budget 列。我们想创建一个列 Budget_rank ,它给我们的结果是: 观察结果 table 看起来首先按日期排序,然后无论哪个预算值相同,它们都会获得相同的排名

Expected Output:

Date       | CID | Budget | Budget_rank 
---------------------------------
2022-05-24 | 123 | 12500  | 1
2022-05-23 | 123 | 12500  | 1
2022-05-16 | 123 | 12500  | 1
2022-05-15 | 123 | 9800   | 2
2022-05-13 | 123 | 9800   | 2
2022-05-12 | 123 | 8400   | 3
2022-05-08 | 123 | 8400   | 3
2022-05-04 | 123 | 15600  | 4
2022-05-02 | 123 | 15600  | 4

任何人都可以协助 SQL 查询来帮助我们生成此列 budget_rank.?

我试过的是:

SELECT 
  Date, 
  CID, 
  Budget, 
  DENSE_RANK() OVER (ORDER BY Budget)
FROM table;

但是这个力给了我们预期的输出!

我需要确保生成 Budget_rank 列,其方式与上面 table 中显示的方式完全相同。对查询或方向的任何帮助都会真正有帮助。 TIA.

您无法使用 DENSE_RANK 函数解决此问题,因为您的排名不遵循特定的预算顺序。你可以做的是使用一个变量来赋值,直到遇到新的预算。您使用 LAG window 函数检查新预算:

SET @ranking = 0;

WITH cte AS (
    SELECT *,
           LAG(Budget) OVER(PARTITION BY CID) AS LastBudget
    FROM tab
)
SELECT Date_,
       CID,
       Budget,
       IF(LastBudget = Budget,
          @ranking, 
          @ranking := @ranking +1
       ) YourRanking
FROM cte

检查此 SQL Fiddle

首先使用LAG() window函数获取每一行的前一个Budget并根据前一个Budget是否为1或0创建一个布尔标志与当前 Budget 不同,然后对标志求和以创建列 Budget_rank:

SELECT Date, CID, Budget,
       SUM(flag) OVER (PARTITION BY CID ORDER BY Date DESC) Budget_rank
FROM (
  SELECT *, Budget <> LAG(Budget, 1, -1) OVER (PARTITION BY CID ORDER BY Date DESC) flag
  FROM tablename
) t
ORDER BY Date DESC;

参见demo