【问题标题】:Select row where column is different from previous row选择列与上一行不同的行
【发布时间】:2020-06-15 16:57:31
【问题描述】:

我正在尝试编写一个查询来跟踪表中布尔列的更改。 表格是这样的

ClientHistory
-------------------------------------------------------------
| id | client_id | client_name | is_active    |   Timestamp |
-------------------------------------------------------------
| 1 |    1       |Example Client|    True     |   06/15/2020|
-------------------------------------------------------------
| 2 |    1       |Client Change |     True    |   06/16/2020|
-------------------------------------------------------------
| 3 |    1       |Client Change |   False     |  06/17/2020 |

所以我想要的是第 3 行,其中 is_active 更改为 false。然后在那之后我想要下一行它再次变为true。

这是我尝试过的:

        SELECT a.*
        FROM client_history AS a
        WHERE a.is_active <>
            ( SELECT b.is_active
                FROM client_history AS b
                WHERE a.client_id = b.client_id
                AND a.timestamp > b.timestamp
                ORDER BY b.timestamp DESC
                LIMIT 1
            ) 

所以子查询试图通过获取它之前的最新时间戳来获取相同 client_id 的前一行。然后在查询中检查 is_active 是否不等于前一行的 is_active。但这并没有按计划进行。我希望当我触发活动/非活动时,它应该在此查询中交替出现,但事实并非如此。有人有什么建议吗?

【问题讨论】:

    标签: python mysql sql flask sqlalchemy


    【解决方案1】:

    使用窗口函数!

    select ch.*
    from (select ch.*,
                 lag(is_active) over (partition by client_id order by timestamp) as prev_is_active
          from client_history ch
         ) ch
    where is_active <> prev_is_active;
    

    【讨论】:

    • 哦,哇,真棒!非常感谢
    猜你喜欢
    • 2022-12-04
    • 2017-06-17
    • 2021-07-10
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2013-12-22
    相关资源
    最近更新 更多