如何比较Google Bigquery中的上一行和当前行?

亚什·托特拉

我的示例表方案如下:

+-------------------------------+
| User | Time        | Property |
|------|-------------|----------| 
| u1   | 2020-02-01  |    p1    |
| u1   | 2020-02-02  |    p1    |
| u1   | 2020-02-03  |    p2    |
| u1   | 2020-02-04  |    p2    |
| u2   | 2020-02-01  |    p2    |
| u2   | 2020-02-02  |    p2    |
| u2   | 2020-02-04  |    p1    |
| u2   | 2020-02-05  |    p1    |
+-------------------------------+

数据由UserTime排序

我想添加一列如下

+--------------------------------------------+
| User | Time        | Property | New_Column |
|------|-------------|----------|------------|
| u1   | 2020-02-01  |    p1    |  1         |
| u1   | 2020-02-02  |    p1    |  1         |
| u1   | 2020-02-03  |    p2    |  2         |
| u1   | 2020-02-04  |    p2    |  2         |
| u2   | 2020-02-01  |    p2    |  3         |
| u2   | 2020-02-02  |    p2    |  3         |
| u2   | 2020-02-04  |    p1    |  4         |
| u2   | 2020-02-05  |    p1    |  4         |
+--------------------------------------------+

在中的值New_Column对于连续的行序列是唯一的,直到UserProperty更改为止


编辑1:

我正在尝试建立一种逻辑,以便及时为用户使用先前的属性。

select 
  *
, lag(property,1) over (partition by User order by Time) as Prev_Property
from table
order by User, Time

接下来我添加一列Row_Number这给了我

+------------------------------------------------------------+
| User | Time        | Property | Prev_Property | Row_Number |
|------|-------------|----------|---------------|------------|
| u1   | 2020-02-01  |    p1    |  Null         | 1          |
| u1   | 2020-02-02  |    p1    |  p1           | 2          |
| u1   | 2020-02-03  |    p2    |  p1           | 3          |
| u1   | 2020-02-04  |    p2    |  p2           | 4          |
| u2   | 2020-02-01  |    p2    |  Null         | 5          |
| u2   | 2020-02-02  |    p2    |  p2           | 6          |
| u2   | 2020-02-04  |    p1    |  p2           | 7          |
| u2   | 2020-02-05  |    p1    |  p1           | 8          |
+------------------------------------------------------------+

我试图建立如下逻辑

CASE
  WHEN Prev_Property is not null
  THEN Row_Number
  WHEN Property <> Prev_Property
  THEN Row_Number
  WHEN Property = Prev_Property
  THEN   -- a logic that gives me the Row_Number of the Prev_Property

我仍在尝试在查询中建立最后几个条件。到目前为止,这是我的尝试。

我不需要New_Column按顺序排列我只希望它们是唯一的并且满足分组条件。

米哈伊尔·伯利安(Mikhail Berlyant)

以下是BigQuery标准SQL

#standardSQL
SELECT * EXCEPT(flag),
  COUNTIF(flag) OVER(ORDER BY User, Time) New_Column 
FROM (
  SELECT *, 
    (User, Property) != LAG((User, Property)) OVER(ORDER BY User, Time) flag
  FROM `project.dataset.table`
)

您可以使用问题中的虚拟数据来测试,玩游戏,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'u1' User, DATE '2020-02-01' Time, 'p1' Property UNION ALL
  SELECT 'u1', '2020-02-02', 'p1' UNION ALL
  SELECT 'u1', '2020-02-03', 'p2' UNION ALL
  SELECT 'u1', '2020-02-04', 'p2' UNION ALL
  SELECT 'u2', '2020-02-01', 'p2' UNION ALL
  SELECT 'u2', '2020-02-02', 'p2' UNION ALL
  SELECT 'u2', '2020-02-04', 'p1' UNION ALL
  SELECT 'u2', '2020-02-05', 'p1' 
)
SELECT * EXCEPT(flag),
  COUNTIF(flag) OVER(ORDER BY User, Time) New_Column 
FROM (
  SELECT *, 
    (User, Property) != LAG((User, Property)) OVER(ORDER BY User, Time) flag
  FROM `project.dataset.table`
)
-- ORDER BY User, Time  

带输出

Row User    Time        Property    New_Column   
1   u1      2020-02-01  p1          0    
2   u1      2020-02-02  p1          0    
3   u1      2020-02-03  p2          1    
4   u1      2020-02-04  p2          1    
5   u2      2020-02-01  p2          2    
6   u2      2020-02-02  p2          2    
7   u2      2020-02-04  p1          3    
8   u2      2020-02-05  p1          3    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SSRS比较当前行和上一行

比较当前行值和上一行值

比较当前行与 SQL Server 中的上一行

比较Spark中当前行和上一行的值

将 java 中的当前行和上一行与扫描仪进行比较

SAS Do-Loop和IF语句,用于比较当前行和上一行的值

需要输出以跟上当前行和上一行的比较

VBScript和SQL Server 2005将当前行与上一行进行比较

比较awk中的当前行和下一行

比较oracle sql中的当前行和下一行

如何计算Postgres当前行和上一行之间的更改百分比?

SQL 视图。如何根据前一行和当前行的比较计算行的值

如何计算表格的上一行并显示在表格的当前行中?

在PostgreSQL中,如何选择上一行的值来计算当前行的值?

如何使用python在新数据框中复制当前行和下一行的值?

如何在Drools中将当前行的属性与上一行的属性进行比较

如何比较当前行与上一行并增加Mode值

如何在 NgFor 中比较当前行和下一行

比较当前行和上一行的值,如果需要,在Spark中比较列的后值

如何将当前行与php中mysql表的下一行进行比较

如何从当前行和上一行获得唯一项的总和,而忽略重复项Oracle SQL

使用上一行和当前行比较进行迭代时跳过行的问题

如何在SQL Server 2008中获得当前行与上一行之间的百分比

如何使用下一行检查当前行并更新当前行而不使用while循环和游标

如果当前行值与Power Bi中的前一行值匹配,如何找到当前行值?

将前一行与当前行进行比较

如何从BigQuery中的每一行获取上一行和下一行的值?

如何在CSV中比较当前行与下一行并在UNIX脚本中显示列差异

如何获得熊猫第一行和当前行之间的差异