[英]MySQL find rows where yesterday's value is > X AND where last 5 days value < X exists
假設我有下表:
date | name | value
----------------------------
2020-09-01 | name1 | 10
2020-09-02 | name1 | 9
2020-09-03 | name1 | 12
2020-09-04 | name1 | 11
2020-09-05 | name1 | 11
我想確定最新值 >= 10 且在過去 5 天中低於 10 的名稱。在上面的示例表中,將返回 name1,因為最新日期的值為 11(> 10),並且在過去 5 天里它至少有一次跌破 10。
這是我的 SELECT 語句,但它總是返回零行:
SELECT
name,
count(value) as count
FROM table_name
WHERE
(date = @date AND value >= 10) AND
date BETWEEN date_sub(@date, interval 5 day) AND @date AND value < 10
GROUP BY name
HAVING count < 5
ORDER BY name
我明白為什么它失敗了,但我不知道要改變什么。
在 MySQL 8.0 中,您可以使用 window 函數和聚合:
select name
from (
select t.*, row_number() over(partition by name order by date desc) rn
from mytable t
where date >= @date - interval 5 day and date <= @date
) t
having max(case when rn = 1 then value end) >= 10 and min(value) <= 10
這樣的事情怎么樣:
SELECT Name, COUNT(*) AS Ct FROM
(SELECT A.*,B.mdate,
CASE WHEN A.date=B.mdate AND A.value >= 10 THEN 1
WHEN A.date >= B.mdate - INTERVAL 5 DAY AND A.date <> B.mdate AND A.value < 10 THEN 1
ELSE 0 END AS Chk
FROM table_name A
JOIN (SELECT Name,MAX(DATE) AS mdate FROM table_name GROUP BY Name) B ON A.Name=B.Name
HAVING Chk <> 0) V
GROUP BY Name
HAVING Ct >= 2
這里有一個小提琴供參考: https://www.db-fiddle.com/f/jX4GktCdTrUbqHBf7ZQwdr/0
這是上面的查詢正在做什么的細分。
table_name
與同一表的子查詢連接起來,但使用MAX(DATE)
值進行比較。CASE
function 檢查您的情況; 如果符合條件,則返回1
,否則返回0
。 添加了HAVING
以從CASE
function 中排除任何0
值。V
)並對name
上發生的次數執行COUNT(*)
,然后再次使用HAVING
獲取出現 2 次或更多次的任何name
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.