【问题标题】:SQL query for entries of last N jobs最后 N 个作业条目的 SQL 查询
【发布时间】:2021-09-13 10:55:56
【问题描述】:

我有下表:

UnixTime  JobID  Status   Data
 1010        1   start     ...
 1012        1   running   ...
 1013        2   start     ...
 1015        1   ok        ...
 1016        2   running   ...
 1017        3   begin     ...
 1018        2   error     ...
 1021        3   running   ...
 1022        4   start     ...
 1023        5   start     ...

等等,所以基本上工作会同时添加条目

我正在寻找一个有效的查询来返回最新(按时间)N 个作业的所有条目

所以找到每个作业的第一个(按时间)条目,然后使用它获取最新的 N 个作业及其所有条目

所以对于上表和 N=3 我会得到:

 1017        3   begin     ...
 1021        3   running   ...
 1022        4   start     ...
 1023        5   start     ...

我了解此类查询将涉及 PARTITION BY 但不确定如何进行?

(我需要一个有效的 SqlLite 查询)

【问题讨论】:

    标签: sql sqlite max sql-order-by


    【解决方案1】:

    你需要这个查询:

    SELECT JobID
    FROM tablename
    GROUP BY JobID
    ORDER BY MAX(UnixTime) DESC LIMIT 3
    

    返回最后 3 个不同的 JobIDs。

    您可以将它与运算符IN一起使用:

    SELECT *
    FROM tablename
    WHERE JobID IN (
      SELECT JobID
      FROM tablename
      GROUP BY JobID
      ORDER BY MAX(UnixTime) DESC LIMIT 3
    )
    ORDER BY UnixTime;
    

    请参阅demo

    【讨论】:

    • 我预计这会比其他答案中的加入慢得多,但事实并非如此!和整体更简单的感谢
    【解决方案2】:

    嗯。 . .如果作业按顺序递增,您可以使用dense_rank()

    select t.*
    from (select t.*,
                 dense_rank() over (order by jobid desc) as seqnum
          from t
         ) t
    where seqnum <= 3  -- or whatever number you want
    order by unixtime;
    

    如果需要赶时间,可以先获取每个job的最早时间,然后使用dense_rank()

    select t.*
    from (select t.*,
                 dense_rank() over (order by min_unixtime desc, jobid desc) as seqnum
          from (select t.*,
                       min(unixtime) over (partition by jobid) as min_unixtime
                from t
               ) t
         ) t
    where seqnum <= 3  -- or whatever number you want
    order by unixtime;
    

    另一个有趣的方法使用聚合:

    select t.*
    from t join
         (select jobid, min(unixtime) as min_unixtime
          from t
          group by jobid
          order by min_unixtime desc
          limit 3
         ) t3
         on t.jobid = t3.jobid
    

    【讨论】:

    • 谢谢,作业不会按顺序递增,请参见示例表,同样对于您的最后一个解决方案,为什么要使用左连接?这不会返回所有条目吗?
    • @kofifus 。 . .你对最后一个解决方案是完全正确的。我不知道left 是如何进入那里的。
    猜你喜欢
    • 2021-11-09
    • 2020-06-21
    • 1970-01-01
    • 2013-12-31
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多