簡體   English   中英

MySQL 查找昨天的值 > X 且最近 5 天的值 < X 的行

[英]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

這是上面的查詢正在做什么的細分。

  1. table_name與同一表的子查詢連接起來,但使用MAX(DATE)值進行比較。
  2. 使用CASE function 檢查您的情況; 如果符合條件,則返回1 ,否則返回0 添加了HAVING以從CASE function 中排除任何0值。
  3. 將查詢變為子查詢(分配為V )並對name上發生的次數執行COUNT(*) ,然后再次使用HAVING獲取出現 2 次或更多次的任何name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM