mysql - 根据累计运行总计分配标志
问题描述
我有一个如上所示的表,它来自以下查询:
SELECT f_id, f_datetime, (f_player1_score+f_player2_score) AS legs,
SUM(f_player1_score+f_player2_score) OVER (ORDER BY f_datetime DESC) AS total_legs,
IF(DATE(f_datetime) = DATE(NOW()), 1, 0) AS f_status
FROM results
我希望我创建的f_status查询列具有以下规则:
1 - If `DATE(f_datetime) = DATE(NOW())` THEN assign `f_status=1`, which is what I've done.
2 - take the maximum total legs where `f_status=1` (i.e. 4 and add 50), then assign `f_status=2` up to total_legs=54,
3) Anything after 2) assign as 3
所需的输出如下:
我知道如何做到这一点,但它需要很多表别名,而且真的很乱。有没有简单的方法来解决它?
谢谢
解决方案
如果我正确地遵循,您可以添加一个CASE
带有您想要的布尔逻辑的表达式:
SELECT f_id, f_datetime,
(f_player1_score+f_player2_score) AS legs,
SUM(f_player1_score+f_player2_score) OVER (ORDER BY f_datetime DESC) AS total_legs,
(CASE WHEN DATE(f_datetime) = CURDATE())
THEN 1
WHEN SUM(f_player1_score+f_player2_score) OVER (ORDER BY f_datetime DESC) <= 54
THEN 2
ELSE 3
END) AS f_status
FROM results ;
编辑:
如果54
只是50
加上当天,您可以使用:
SELECT f_id, f_datetime,
(f_player1_score+f_player2_score) AS legs,
SUM(f_player1_score + f_player2_score) OVER (ORDER BY f_datetime DESC) AS total_legs,
(CASE WHEN DATE(f_datetime) = CURDATE()
THEN 1
WHEN SUM(f_player1_score + f_player2_score) OVER (ORDER BY f_datetime) <=
50 + SUM(CASE WHEN DATE(f_datetime) = CURDATE() THEN f_player1_score + f_player2_score ELSE 0 END)
THEN 2
ELSE 3
END) AS f_status
FROM results ;
推荐阅读
- django - 有没有办法通过 Django 模板在 if 条件中使用模型字段?
- python - 如何更快地裁剪出高振幅的音频部分
- c# - Add-Type 不支持字典初始化语法?
- java - 重构 if else 分支的最佳方法是什么
- angular - 何时使用 Angular mat-card 组件
- python - 如何使用 Oracle 表中的 Nans 更新 Pandas 数据框,以使 Nans 变为 NULL?
- jquery - TinyMCE 中的奇怪问题 - WIRIS
- azure - Azure ADF - 删除不同组件的顺序应该是什么
- java - 不确定密码检查器的逻辑错误在哪里
- python - 图像压缩后将图像评论转移到新评论