2017-12-28 27 views
1

SQL(Google Big Query)はSUM関数ですが、間隔をカウントする必要があることは知っています。例えば、SQLカウントの間隔がN秒を超えている

create table BATTLE (battleID VARCHAR(256), countryID VARCHAR(256), yearBATTLE INT); 

insert into BATTLE VALUES ('Battle1', 'Country1', 1567); 
insert into BATTLE VALUES ('Battle2', 'Country2', 1568); 
insert into BATTLE VALUES ('Battle3', 'Country2', 1570); 
insert into BATTLE VALUES ('Battle4', 'Country3', 1599); 
insert into BATTLE VALUES ('Battle5', 'Country2', 1575); 
insert into BATTLE VALUES ('Battle6', 'Country2', 1620); 
...... 

は、私は1つの戦争が10年未満の間隔で一つのクライアントのための戦いの連続である戦争、の量を見つける必要があります。

+0

あなたの質問は不明です。表形式のデータと結果が役立ちます。そして、「戦争量」は何ですか? –

答えて

1

は、BigQueryの標準SQL

のためでありますあなたがテスト/あなたの質問からダミーデータを使用して、上記で遊ぶことができます
#standardSQL 
SELECT 
    countryID, 
    MIN(yearBATTLE) start, 
    MAX(yearBATTLE) finish, 
    ARRAY_AGG(STRUCT(battleID, yearBATTLE)) battels 
FROM (
    SELECT 
    battleID, countryID, yearBATTLE, 
    SUM(delta) OVER(PARTITION BY countryID ORDER BY yearBATTLE) AS grp 
    FROM (
    SELECT 
     battleID, countryID, yearBATTLE, 
     IF(yearBATTLE - IFNULL(LAG(yearBATTLE) OVER(PARTITION BY countryID ORDER BY yearBATTLE), yearBATTLE) <= 10, 0, 1) AS delta 
    FROM `yourproject.yourdataset.battle` 
) 
) 
GROUP BY countryID, grp 
ORDER BY countryID, grp 

(私は例のために5年に10年に変更)

#standardSQL 
WITH `yourproject.yourdataset.battle` AS (
    SELECT 'Battle1' battleID, 'Country1' countryID, 1567 yearBATTLE UNION ALL 
    SELECT 'Battle2',   'Country2',   1568 UNION ALL 
    SELECT 'Battle3',   'Country2',   1570 UNION ALL 
    SELECT 'Battle4',   'Country3',   1599 UNION ALL 
    SELECT 'Battle5',   'Country2',   1575 UNION ALL 
    SELECT 'Battle6',   'Country2',   1620 
) 
SELECT 
    countryID, 
    MIN(yearBATTLE) start, 
    MAX(yearBATTLE) finish, 
    ARRAY_AGG(STRUCT(battleID, yearBATTLE)) battels 
FROM (
    SELECT 
    battleID, countryID, yearBATTLE, 
    SUM(delta) OVER(PARTITION BY countryID ORDER BY yearBATTLE) AS grp 
    FROM (
    SELECT 
     battleID, countryID, yearBATTLE, 
     IF(yearBATTLE - IFNULL(LAG(yearBATTLE) OVER(PARTITION BY countryID ORDER BY yearBATTLE), yearBATTLE) <= 5, 0, 1) AS delta 
    FROM `yourproject.yourdataset.battle` 
) 
) 
GROUP BY countryID, grp 
ORDER BY countryID, grp 

結果は次のとおりです

countryID start finish  battels.battleID battels.yearBATTLE  
Country1 1567 1567  Battle1    1567 
Country2 1568 1575  Battle2    1568 
           Battle3    1570 
           Battle5    1575 
Country2 1620 1620  Battle6    1620 
Country3 1599 1599  Battle4    1599 
+0

大変ありがとうございます。スクリプトは成功です。 – Vadim

0

ご質問は不明であるが、あなたは戦争が戦いのシーケンスであることを意味するならば、あなたは自分自身に、テーブルを結合してシーケンスを取得することができます:

以下
select * 
from BATTLE a 
join BATTLE b on a.countryId = b.countryId 
where abs(a.yearBATTLE - b.yearBATTLE) < 10 
and  a.BattleId <> b.battleId