2017-10-10 147 views
-2

我已經閱讀了有關計數連續行的一些類似問題,但沒有一個給出了明確的答案。我希望有人能夠幫我解決我的問題。我有以下表數據:mysql找到三個連續的行,具有相同的值

ID  TEST_VALUES 
1  A 
2  B 
3  C 
4  C 
5  C 
6  C 
7  A 
8  D 
9  D 
10  D 
11  B 
12  C 
13  C 
14  C 
15  C 

現在我想找到與ID範圍內的相同值的連續三行是1〜10,例如當ID範圍爲1至10,具有' C'連續出現三次以上。 (注:這個問題有沒有關係ID,列ID是隻爲我的查詢條件,如其中ID> 1和ID < 10)

+2

不太工作爲SQL。 SQL對集合起作用,並且根據其定義,集合是[順序無關的項目集合](https://en.wikipedia.org/wiki/Set_(mathematics)#Describing_sets)。它可以使用變量在MySQL中完成。醜陋。 – axiac

+0

存在一個純粹的SQL解決方案(即,不存在通過變量,賦值和增量將查詢轉換爲for循環的解決方案),但只有在「ID」的值沒有任何間隙時才起作用柱。 – axiac

+0

@axiac,這可以通過幾個LEFT JOIN在純SQL中完成,而不需要ID是順序的。這有點棘手,所以我現在不能寫,但是當我有一段時間後我會發布解決方案。我可以提前告訴你,像我的第一個解決方案,它會返回一個單行,但它也會返回匹配的ID,每個都在一個單獨的列中,這有希望足以滿足OP。 – kmoser

回答

1

,你可以嘗試這一個的那些行,

SELECT TEST_VALUES, MAX(cnt) AS maxCount 
FROM (
    SELECT TEST_VALUES, ID, COUNT(grp) AS cnt 
    FROM (
    SELECT ID, TEST_VALUES, rn - rnByVal AS grp 
    FROM (
     SELECT ID, TEST_VALUES, 
      @rn := @rn + 1 AS rn, 
      @rnByVal := IF (@val = TEST_VALUES, 
          IF (@val := TEST_VALUES, @rnByVal + 1, @rnByVal + 1), 
          IF (@val := TEST_VALUES, 1, 1)) AS rnByVal 
     FROM mytable 
     CROSS JOIN (SELECT @rn := 0, @rnByVal := 0, @val := '') AS vars 
     ORDER BY ID) AS t 
    ) AS s 
    GROUP BY TEST_VALUES, grp) AS u 
GROUP BY TEST_VALUES 

這將是返回最大計數具有相同的值出現連續行(更然後1)。

+0

感謝您的回答,答案接近我想要的! – bfther

+0

好@bfther。如果其有用的方式請投票/接受我的答案。 –

+0

ippadi kenji聲望vangiraye unaku vekkama illaya先生mish anish sathish ..哈哈 – radhakrishnan

0
SELECT 
    GROUP_CONCAT(`TEST_VALUES` ORDER BY `id` ASC) AS g 
FROM 
    `tbl` 
WHERE 
    `ID` >=1 AND `ID` <= 10 
HAVING 
    g LIKE '%C,C,C,C%' 

責令GROUP_CONCAT()通過id保證結果是連續的。該HAVING條款只提取其中包含C.

的至少四個連續的情況下
+0

我幾乎提高了這個答案,然後我意識到,由於缺少「GROUP BY」子句,它只生成一行,其中包含以逗號連接的「TEST_VALUE」列的所有值。 – axiac

+0

感謝您的回答 – bfther

+0

@axiac,這正是OP所要求的:它返回一行,指示在分析的記錄中是否至少有4個連續的「C」。我想我應該添加''WHERE ID> = 1 AND ID <= 10'',但否則它會滿足要求。 – kmoser

0

我也想到了解決辦法,希望能幫助別人

SELECT 
TEST_VALUES 
FROM(
    SELECT 
    m.TEST_VALUES AS TEST_VALUES, 
    IF(@b = m.TEST_VALUES, @a := @a +1, @a := 0) AS countNUM, 
    @b := m.TEST_VALUES 
    FROM tableName m 
    JOIN (
     SELECT 
     @a := 0 
    ) AS t 
) AS TEMP 
WHERE countNUM >= 2 
GROUP BY TEST_VALUES 
0

令人費解,但測試工作:

SELECT t1.ID AS t1_id, t1.TEST_VALUES AS t1_values, 
(SELECT ID FROM test WHERE test.ID > t1.ID LIMIT 1) AS t2_id, (SELECT TEST_VALUES FROM test WHERE test.ID > t1.ID LIMIT 1) AS t2_values, 
(SELECT ID FROM test WHERE test.ID > (SELECT ID FROM test WHERE test.ID > t1.ID LIMIT 1) LIMIT 1) AS t3_id, (SELECT TEST_VALUES FROM test WHERE test.ID > (SELECT ID FROM test WHERE test.ID > t1.ID LIMIT 1) LIMIT 1) AS t3_values, 
(SELECT ID FROM test WHERE test.ID > (SELECT ID FROM test WHERE test.ID > (SELECT ID FROM test WHERE test.ID > t1.ID LIMIT 1) LIMIT 1) LIMIT 1) AS t4_id, (SELECT TEST_VALUES FROM test WHERE test.ID > (SELECT ID FROM test WHERE test.ID > (SELECT ID FROM test WHERE test.ID > t1.ID LIMIT 1) LIMIT 1) LIMIT 1) AS t4_values 
FROM test AS t1 
HAVING (
    ID BETWEEN 1 AND 10 AND t2_id BETWEEN 1 AND 10 AND t3_id BETWEEN 1 AND 10 AND t4_id BETWEEN 1 AND 10 
     AND 
t1_values = t2_values AND t2_values = t3_values AND t3_values = t4_values 
) 

給出了這些結果:

+-------+-----------+-------+-----------+-------+-----------+-------+-----------+ 
| t1_id | t1_values | t2_id | t2_values | t3_id | t3_values | t4_id | t4_values | 
+-------+-----------+-------+-----------+-------+-----------+-------+-----------+ 
|  3 | C   |  4 | C   |  5 | C   |  6 | C   | 
+-------+-----------+-------+-----------+-------+-----------+-------+-----------+ 
1 row in set (0.03 sec) 
相關問題