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。
我们有 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。