2016-02-03 57 views
2

我有一個表:如何識別使用MySQL重複序列值的實體?

UNIT_ID | YEAR | MONTH | VAR 
---------+------+-------+------ 
    1 | 2015 | 1 | 0 
    1 | 2015 | 2 | 0 
    1 | 2015 | 3 | 0 
    2 | 2015 | 1 | 10 
    2 | 2015 | 2 | 10 
    2 | 2015 | 3 | 10 
    1 | 2015 | 4 | 5 
    1 | 2015 | 5 | 5 
    1 | 2015 | 6 | 5 
    2 | 2015 | 4 | 10 
    2 | 2015 | 5 | 3 
    2 | 2015 | 6 | 3 
    3 | 2016 | 1 | 3 
    3 | 2016 | 2 | 3 
    3 | 2016 | 3 | 3 
    3 | 2016 | 4 | 3 
    2 | 2016 | 6 | 0 
    2 | 2016 | 7 | 0 
    2 | 2016 | 8 | 0 

我想知道哪個單元具有大於3個零或重複大於4倍的值更大的序列。按年份分組。所以,我的成績表會是這樣的:

1 | 2015 | true 
2 | 2015 | true 
2 | 2016 | true 

我發現this solution但不幸的是我無法適應我的情況。我還需要查詢是在MySQL中。

+1

如果有差距,會發生什麼?例如,如果最後一行是2016-09而非2016-08? –

+0

所以它不被認爲是連續的。但爲了簡單起見,您可以考慮沒有差距。 –

回答

1

你可以加入他們4次。最後加入是left join以允許3 0的情況。

select a.unit_id, a.year, 'true' 
from tbl a 
join tbl b on a.unit_id = b.unit_id and a.year = b.year and a.month+1 = b.month and a.var = b.var 
join tbl c on b.unit_id = c.unit_id and b.year = c.year and b.month+1 = c.month and b.var = c.var 
left join tbl d on c.unit_id = d.unit_id and c.year = d.year and c.month+1 = d.month and c.var = d.var 
where a.var = 0 or d.var is not null; 

更快更通用的解決方案。它掃描表一次,並使用用戶定義的變量(@pu對於以前UNIT_ID,@py爲前一年等)要記住上一行:

select distinct unit_id, year 
from (
    select unit_id, `year`, `month`, `var`, 
    if([email protected] and `year`[email protected] and `month`[email protected]+1 and `var`[email protected], @i:[email protected]+1, @i:=1)* 
    if(@pu:=unit_id,1,1)*if(@py:=`year`,1,1)*if(@pm:=`month`,1,1)*if(@pv:=`var`,1,1) as c 
    from table1 a 
    join (select @pu:=null, @py:=null, @pm:=null, @pv:=null, @i:=1) b 
    order by unit_id, `year`, `month`, `var`) a 
group by unit_id, `year`, `var` 
having (`var` = 0 and max(c) >= 3) or (`var` != 0 and max(c) >= 4); 

fiddle

+0

您好, 感謝您的回答。我試圖應用於我的數據,但由於有數百萬行此查詢需要一點點執行(現在超過3小時)。也許我可以微調我的索引,但我想知道是否有另一種方式,更少的計算成本和更通用的,例如,如果我想將標準從4個連續更改爲6 ... –

+0

是的。我發現了一個更快更通用的解決方案!看到更新的答案 – Fabricator

+0

嘿,非常感謝你,作品像一個魅力。我必須開始使用變量。 –