【问题标题】:SQL to get some groups and keep the orderSQL获取一些组并保持顺序
【发布时间】:2020-10-13 19:01:09
【问题描述】:

我有一个示例数据如下。

+---------+------------+--------+
| user id |   sequence | Action |
|---------|------------|--------|
| 12345   |    1       | Run    |
| 12345   |    2       | Sit    |
| 12345   |    3       | Sit    |
| 12345   |    4       | Run    |
| 12345   |    5       | Run    |
| 12345   |    6       | Sit    |
+---------+------------+--------+

现在我希望结果应该是这样的:

+---------+---------+
| user id |  Action |
|---------|---------|
| 12345   |  Run    |
| 12345   |  Sit    |
| 12345   |  Run    |
| 12345   |  Sit    |
+---------+---------+

序列#2 和#3 的行应该合并,#4 和#5 应该合并。 我使用“按操作分组”会得到如下表的答案,但这不是我想要的:

+---------+---------+
| user id |  Action |
|---------|---------|
| 12345   |  Run    |
| 12345   |  Sit    |
+---------+---------+

如何实现 SQL(我使用 Google Bigquery)?

谢谢一百万!

【问题讨论】:

  • 您使用的是哪种 DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您使用的数据库产品添加tagWhy should I tag my DBMS

标签: sql select google-bigquery window-functions gaps-and-islands


【解决方案1】:

BigQuery 标准 SQL 如下

#standardSQL
SELECT * EXCEPT(dup) FROM (
  SELECT *, action = LAG(action, 1, '') OVER(PARTITION BY user_id ORDER BY sequence) AS dup
  FROM `project.dataset.table`
)
WHERE NOT dup

如果应用于您问题中的样本数据 - 输出是

Row user_id sequence    action   
1   12345   1           Run  
2   12345   2           Sit  
3   12345   4           Run  
4   12345   6           Sit  

【讨论】:

  • 这对我来说太棒了!感谢您及时提供答案!
  • @LucasLee - 如果有帮助,也可以考虑对答案进行投票
【解决方案2】:

您可以使用窗口函数:想法是将每一行上的操作与“上一个”操作进行比较,并过滤值发生变化的行:

select *
from (
    select t.*, lag(action) over(partition by user_id order by sequence) lag_action
    from mytable t
) t
where action <> lag_action or lag_action is null

【讨论】:

  • 谢谢!很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 2018-10-15
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多