【问题标题】:How to query record based on timestamp and boolean value?如何根据时间戳和布尔值查询记录?
【发布时间】:2016-11-25 03:17:42
【问题描述】:

我有一个付款表,用于存储付款相关数据。

Student_id   is_payment_done   timestamp

A111A11      false             2016/11/23 00:00:00  
A111A11      false             2016/11/24 12:12:00                  
A111A11      false             2016/11/24 16:20:11*  
B234A12      false           
B234A12      false           
B124A12      true           
B123A12      false           

这里我有 student_id 外键。现在我想选择is_payment_done=false 的student_id 记录,我想显示最新记录,例如。在上表中A111A11 记录中包含所有is_payment_dont=false,最新记录的时间戳为2016/11/24 16:20:11*

我对 SQL 非常陌生,我尝试过使用 group by student_id,但我不知道该使用哪个聚合函数以及如何在分组后检查所有记录的布尔字段。

【问题讨论】:

    标签: mysql sql postgresql


    【解决方案1】:

    我的 SQL 方法,不需要子查询或任何东西,因为如果所有记录都是假的,那么MAX(timestamp) 也是假的。如果您没有限制所有记录,您仍然可以使用条件聚合来查找MAX(false timestamp)

    SELECT
        Student_id
        ,MAX(timestamp) as MaxTimeStamp
    FROM
        @Payment
    GROUP BY
        Student_id
    HAVING
        COUNT(*) = COUNT(CASE WHEN is_payment_done = 'false' THEN 1 END)
    

    但请注意,在您的示例数据中,A111A11、B123A12 和 B234A12 都只有 is_payment_done = 'false' 的记录

    【讨论】:

    • 一些记录可能有假值和真值的组合。
    • @piechuckerr 是的,在我看来,当它们有真假时,你不想要它们?我的查询将获得只有错误记录的任何 student_id 的最大时间戳
    【解决方案2】:
    SELECT *
    FROM Payment
    WHERE Student_id = 'A111A11' AND
      is_payment_done = 'false'
    ORDER BY timestamp DESC
    LIMIT 1;
    

    【讨论】:

    • 这是 1 个学生,有数千名学生。查询不应该是静态的
    • 啊,我误解了你的问题。您将需要使用GROUP BY 子句,然后如@vkp 所示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2018-09-15
    相关资源
    最近更新 更多