SQL 查询最后 N 个作业的条目

SQL query for entries of last N jobs

我有以下 table:

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     ...

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

我正在寻找一个有效查询 return 最新(按时间)N 个职位的所有条目

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

所以对于上面的 table 和 N=3 我会得到:

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

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

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

嗯。 . .如果作业按顺序递增,您可以使用 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

您需要这个查询:

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

returns 最后 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