簡體   English   中英

計算連續的行出現次數

[英]Count consecutive row occurrences

我有一個包含三列的MySQL表: takenOn (datetime - primary key)sleepDay (date)type (int) 該表包含從上床睡覺到起床(間隔一分鍾)的睡眠數據。

例如,如果我在10月29日晚上11:00上床睡覺,並在10月30日早上6:00起來,那么我將有420條記錄(7小時* 60分鍾)。 takenOn范圍為2016-10-29 23:00:002016-10-30 06:00:00 sleepDay將在2016-10-30總共420條記錄。 type是我睡眠的“質量”(1 =睡眠,2 =躁動,3 =清醒)。 我正在嘗試獲取多少我不安/清醒,這可以通過計算連續看到type = 2(或type = 3)的次數來計算。

到目前為止,我必須遵循以下查詢,該查詢僅適用於一天。 這是正確的/“有效的”方法嗎(因為此方法要求我的數據沒有在takenOn有任何“空白”)? 另外,如何擴展它以計算所有可能的sleepDays

SELECT
    sleepDay,
    SUM(CASE WHEN type = 2 THEN 1 ELSE 0 END) AS TimesRestless,
    SUM(CASE WHEN type = 3 THEN 1 ELSE 0 END) AS TimesAwake
FROM
    (SELECT s1.sleepDay, s1.type
    FROM sleep s1
    LEFT JOIN sleep s2
        ON s2.takenOn = ADDTIME(s1.takenOn, '00:01:00')
    WHERE
        (s2.type <> s1.type OR s2.takenOn IS NULL)
        AND s1.sleepDay = '2016-10-30'
    ORDER BY s1.takenOn) a

我創建了一個SQL Fiddle- http: //sqlfiddle.com/#!9/b33b4/3

謝謝!

考慮到您所知道的假設,您自己的解決方案就可以了。

我在這里提出一種替代解決方案,該解決方案可以很好地解決本系列中的空白,並且一次可以使用超過一天。

缺點是它更加依賴於非標准的MySql功能(內聯使用變量):

select sleepDay,
       sum(type = 2) TimesRestless,
       sum(type = 3) TimesAwake
from (
     select @lagDay as lagDay, 
            @lagType as lagType,
            @lagDay := sleepDay as sleepDay,
            @lagType := type as type
     from   (select * from sleep order by takenOn) s1,
            (select @lagDay := '', 
                    @lagType := '') init
     ) s2
where   lagDay <> sleepDay  
     or lagType <> type
group by sleepDay

要查看其工作原理,可以幫助自己選擇第二個select語句。 最里面的select必須具有order by子句,以確保中間查詢將按該順序處理記錄,這對於在那里發生的變量分配很重要。

請參閱更新的SQL小提琴

暫無
暫無

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

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