2017-04-04 75 views
1

這是我的記錄(輸入)。所述field2總是開始於100後,它可以採取以上100分組連續記錄

field1 field2 
=============== 
val1  100 
val2  110 
------------ 
val3  100 
val4  110 
val3  130 
val3  140 
------------ 
val1  100 

任何值我需要組連續記錄與100開始後,它可以是任何數量不是100對於上面的示例我需要的輸出

field 1     field2 
=================================================== 
(val1, val2)    (100, 110) 
(val3, val4, val3, val3) (100, 110, 130, 140) 
(val1)      (100) 

如何做到這一點

+0

定義連續的 – GurV

+0

(1)我刪除了MySQL標籤。這似乎比BQ更偶然。 (2)SQL表格表示*無序*集合。您需要一個指定排序的列。 –

回答

2

讓我假設你有一個指定排序的列。然後,你可以通過每個記錄之前計數的「100」的記錄數,然後使用array_agg()鑑定組:

select array_agg(field1 order by id) as field1s, 
     array_agg(field2 order by id) as field2s 
from (select t.*, 
      sum(case when field2 = 100 then 1 else 0 end) over (order by id) as grp 
     from t 
    ) t 
group by grp; 

注:在MySQL解決方案看起來非常,非常不同。但是,它仍然會以select開頭。

+0

大概我很幼稚。我想知道我將要使用的訂單字段應該是什麼。如問題('input')中給出的那樣,這些是我在運行select查詢時獲取記錄的順序,並且我想根據該順序對記錄進行分組。想知道這是否可能(不使用訂單欄)? – Raj

+1

@Raj。 。 。它是*你的*數據。我不知道要使用哪個字段。但如果你沒有一個,那麼你不能做你想要的。你的邏輯需要對記錄進行排序。 –

1

您必須有一些可用於定義訂單的字段。
在下面的例子,我認爲它是id

下面應該做你期望

#standardSQL 
SELECT 
    CONCAT('(',STRING_AGG(field1 ORDER BY id), ')') AS field1, 
    CONCAT('(',STRING_AGG(CAST(field2 AS STRING) ORDER BY id), ')') AS field2 
FROM (
    SELECT 
    id, field1, field2, 
    COUNTIF(field2 = 100) OVER (ORDER BY id) AS grp 
    FROM yourTable 
) t 
GROUP BY grp 
ORDER BY MIN(id) 

您可以測試/與嘗試下面的僞數據從你的問題是什麼

#standardSQL 
WITH yourTable AS (
    SELECT 1 AS id, 'val1' AS field1, 100 AS field2 UNION ALL 
    SELECT 2 AS id, 'val2' AS field1, 110 AS field2 UNION ALL 
    SELECT 3 AS id, 'val3' AS field1, 100 AS field2 UNION ALL 
    SELECT 4 AS id, 'val4' AS field1, 110 AS field2 UNION ALL 
    SELECT 5 AS id, 'val3' AS field1, 130 AS field2 UNION ALL 
    SELECT 6 AS id, 'val3' AS field1, 140 AS field2 UNION ALL 
    SELECT 7 AS id, 'val1' AS field1, 100 AS field2 
) 
SELECT 
    CONCAT('(',STRING_AGG(field1 ORDER BY id), ')') AS field1, 
    CONCAT('(',STRING_AGG(CAST(field2 AS STRING) ORDER BY id), ')') AS field2 
FROM (
    SELECT 
    id, field1, field2, 
    COUNTIF(field2 = 100) OVER (ORDER BY id) AS grp 
    FROM yourTable 
) 
GROUP BY grp 
ORDER BY MIN(id) 

輸出爲

field1     field2 
------     ------ 
(val1,val2)    (100,110)  
(val3,val4,val3,val3) (100,110,130,140)  
(val1)     (100)  

想知道如果這是可能的(不使用訂單欄)?

如果你真的有隻在您的表的兩個領域 - 你最有可能的運氣了,需要重新審視與附加字段填入本表的邏輯被用於訂購(作爲時間軸)

作爲一個完全最後的手段 - 你可以嘗試例子飛產生這樣欄下方 - 但請理解也絕對在得到命令,你希望

#standardSQL 
WITH yourTable AS (
    SELECT 'val1' AS field1, 100 AS field2 UNION ALL 
    SELECT 'val2' AS field1, 110 AS field2 UNION ALL 
    SELECT 'val3' AS field1, 100 AS field2 UNION ALL 
    SELECT 'val4' AS field1, 110 AS field2 UNION ALL 
    SELECT 'val3' AS field1, 130 AS field2 UNION ALL 
    SELECT 'val3' AS field1, 140 AS field2 UNION ALL 
    SELECT 'val1' AS field1, 100 AS field2 
), 
tempTable AS (
    SELECT field1, field2, ROW_NUMBER() OVER() AS id 
    FROM yourTable 
) 
SELECT 
    CONCAT('(',STRING_AGG(field1 ORDER BY id), ')') AS field1, 
    CONCAT('(',STRING_AGG(CAST(field2 AS STRING) ORDER BY id), ')') AS field2 
FROM (
    SELECT 
    id, field1, field2, 
    COUNTIF(field2 = 100) OVER (ORDER BY id) AS grp 
    FROM tempTable 
) 
GROUP BY grp 
ORDER BY MIN(id) 

輸出是一樣不能保證 - 但是 - 不能保證在裏面!!!

field1     field2 
------     ------ 
(val1,val2)    (100,110)  
(val3,val4,val3,val3) (100,110,130,140)  
(val1)     (100)  
+1

@raj - 你必須有一些明確或派生的領域進行排序。查詢引擎無法使用您的眼睛看到的視覺順序。你的桌子上還有其他領域嗎?或者只有這兩個領域? –

+0

我沒有具體的領域,我已經訂購......但是...終於我能夠從我的團隊得到一些其他領域,我可以用於分組數據......爲我解決問題:) – Raj

+0

我已經upvoted兩個答案...但無法弄清楚:(哪一個選擇作爲一個接受的答案,因爲兩者都有幫助 – Raj