【问题标题】:SQL: How to get the enough days of events such that I have at least 50 eventsSQL:如何获得足够的事件天数,使我至少有 50 个事件
【发布时间】:2018-08-11 23:09:40
【问题描述】:

我有一个事件表。每个事件都有一个日期。我的 API 要求我在某个日期之前/之后至少返回 X 个事件,但我必须返回每个日期的所有事件。 如果我在代码中这样做,我会做一些事情,比如按日期对事件进行分组并按升序/降序排序,然后花足够的时间让我至少有 50 个事件。

这是我目前所拥有的:

.... 来自“事件”WHERE(日期在 (选择不同的日期 从事件 日期

但它只返回 16 个事件,即使数据库中有更多事件。

我认为要使其正常工作,我需要执行一些操作,例如获取每天的事件数,然后获取足够的天数,使事件的总和 >= X(例如 50),然后返回实际事件。 那是怎么做的?那么这样的查询应该如何正确编写呢?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    这段代码应该工作:

    select e.*
    from events e
    where date in (select e2.date
                   from events e2
                   where e2.date <= '2018-08-12'
                   order by e2.date desc
                   limit 50
                  );
    

    它不起作用的一个原因是date 真的有时间组件。如果是这种情况,那么转换值将解决问题:

    select e.*
    from events e
    where date::date in (select e2.date::date
                         from events e2
                         where e2.date <= '2018-08-12'
                         order by e2.date desc
                         limit 50
                        );
    

    【讨论】:

    • 感谢您抽出宝贵时间回复。据我所知,您的查询与我的基本相同,只是您删除了“distinct”关键字,并使子查询将事件称为 e2 而不是 e。但是,我只发布了我让 django 为我生成的查询的主要部分——即查询本身“有效”但没有返回预期的结果。您所做的更改如何解决问题?顺便说一句,我的日期没有时间部分。
    • @Relman 。 . .正如答案所指出的,如果date 有时间组件,您的查询将不起作用。第二个版本解决了这个问题。
    • 我用我的代码解决了问题:您确认的上述算法是正确的。问题是我的 django 代码进一步过滤了结果并减少了返回结果的列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多