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 个不同的 JobID
s。
您可以将它与运算符 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。
我有以下 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 个不同的 JobID
s。
您可以将它与运算符 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。