放弃Google BigQuery标准SQL中具有非连续数字的行

放弃Google BigQuery标准SQL中具有非连续数字的行,sql,google-bigquery,Sql,Google Bigquery,为了简洁起见,我有一个数据集,其字段包含重复的数字序列1-5,还有一些行的数字顺序不正确: 1 2 3 5 -- out of sequence, need to discard 4 5 1 -- sequence starts over 2 3 4 ... 如何丢弃顺序不正确的行? 谢谢 更新:还有其他列指定排序 UPDATE2:用于测试的数据集: WITH t AS ( SELECT * FROM UNNEST([ STRUCT(1 AS id, 1 AS n),

为了简洁起见,我有一个数据集,其字段包含重复的数字序列1-5,还有一些行的数字顺序不正确:

1
2
3
5 -- out of sequence, need to discard
4
5
1 -- sequence starts over
2
3
4
...
如何丢弃顺序不正确的行? 谢谢

更新:还有其他列指定排序

UPDATE2:用于测试的数据集:

WITH t AS (
  SELECT * FROM
  UNNEST([
    STRUCT(1 AS id, 1 AS n),
    (2, 2),
    (3, 3),
    (4, 5),
    (5, 4),
    (6, 5),
    (7, 1),
    (8, 2),
    (9, 3),
    (10, 4)
  ])
)

更新3:在同一个1-5范围内,可能会有许多数字顺序错误。序列总是从1开始,并且所有数字都存在,但最后一轮除外,最后一轮可能不完整,可能会提前结束,请参见测试集。无序的数字就像一个噪声,需要去除。

让我假设您有另一列来指定顺序。如果不是,则问题的定义不明确

如果是,您可以使用lag:


那个?用于指定排序的列。

假设您有另一列指定排序。如果不是,则问题的定义不明确

如果是,您可以使用lag:


那个?用于指定排序的列。

下面是用于BigQuery标准SQL并使用JS UDF的 Tt返回所有找到的以1开头的序列和以下连续的数字

标准SQL 创建临时函数extract_sequencearr数组 返回数组 语言JSAS 目标=[1,2,3,4,5]; var结果=[]; j=0; 对于i=0;i 行id n grp 1 1 1 1 2 2 2 1 3 3 3 1 4 5 4 1 5 6 5 1 6 7 1 2 7 8 2 2 8 9 3 2 9 10 4 2
希望您能根据自己的具体情况进行调整

以下是针对BigQuery标准SQL和使用JS UDF的情况 Tt返回所有找到的以1开头的序列和以下连续的数字

标准SQL 创建临时函数extract_sequencearr数组 返回数组 语言JSAS 目标=[1,2,3,4,5]; var结果=[]; j=0; 对于i=0;i 行id n grp 1 1 1 1 2 2 2 1 3 3 3 1 4 5 4 1 5 6 5 1 6 7 1 2 7 8 2 2 8 9 3 2 9 10 4 2
希望您能根据具体情况进行调整

SQL表表示无序集。哪一列用于确定顺序?提供的示例非常简单,至少对我来说并没有给出一般情况。您能否澄清排除逻辑—仅一个无序行,也可以是多行,以此类推,以及生存行的逻辑—它们应该代表整个集合1-5,还是可以是部分的?等等-例如,如果序列是1,2,3,5,3,4,1,2,3,4-幸存的数字会是1,2,3,3,4,1,2,3,4吗?如果没有这些细节,在这里回答只是空话:o@MikhailBerlyant感谢您的评论,请参阅update3,您的序列的答案是1,2,3,4。所有其他的都将被丢弃,因为在开始新的序列之前,它应该运行一整轮,除了最后一轮SQL表表示无序集。哪一列用于确定顺序?提供的示例非常简单,至少对我来说并没有给出一般情况。您能否澄清排除逻辑—仅一个无序行,也可以是多行,以此类推,以及生存行的逻辑—它们应该代表整个集合1-5,还是可以是部分的?等等-例如,如果序列是1,2,3,5,3,4,1,2,3,4-幸存的数字会是1,2,3,3,4,1,2,3,4吗?如果没有这些细节,在这里回答只是空话:o@MikhailBerlyant感谢您的评论,请参阅更新3,您的顺序的答案是1,2,3,4。所有其他的都将被丢弃,因为在开始新的一个之前,除了最后一个,其他的都将被丢弃round@AfanasiiKurakin . . . 这似乎值得怀疑。你的答案给出了1,2,3,5,1,2,3,4的结果,应该是1,2,3,4,5,1,2,3,4-我用的是另一个的顺序column@AfanasiiKurakin . . . 这似乎值得怀疑。你在使用吗
按列的顺序正确吗?你的答案给出了1,2,3,5,1,2,3,4结果,应该是1,2,3,4,5,1,2,3,4-我在按另一列的顺序
select t.*
from (select t.*, lag(col) over (order by row) as prev_col
      from t
     ) t
where (prev_col is null) or 
      (prev_col = col - 1) or
      (prev_col = 5 and col = 1);