我有一个包含3列的表:
computerID
ScanDate
vulnerability level.
我希望按 computerID 进行分组,并获取最新 scanDate 的漏洞级别,而无需添加内部联接(该表非常大)。
有可能吗?
答案 0 :(得分:1)
有时,使用not exists
可以比group by
更好地工作。并非总是如此,但值得一试:
select d.*
from derived d
where not exists (select 1
from derived d2
where d2.computer = d.computer and d2.scandate > d.scandate
);
或者,如果您已经在进行group by
,那么就会有substring_index()
/ group_concat()
诀窍:
select computer, max(scandate),
substring_index(group_concat(vulnerability order by scandate desc), ',', 1)
from derived d2
group by computer;
你需要小心一点。如果vulnerability
是一个字符串并且可以包含逗号,则需要使用不同的分隔符。如果vulnerability
不是字符串,则将其转换为一个字符串。并且,如果日期太多,那么您可能会达到group_concat()
的限制(group_concat()
结果的最大长度由参数控制,因此也可以修复。)
答案 1 :(得分:0)
我知道没有办法在没有加入或子查询的情况下完成你想要的东西。
这是一个即将开始的联接 - 尽管从构成派生表的表构建它可能会更好:
select t1.computerid, t1.vulnerability_level, t1.scandate
from threats t1
left join threats t2
on t1.computerid = t2.computerid and t1.scandate < t2.scandate
where t2.scandate is null;
假设您的派生表称为威胁。
答案 2 :(得分:0)
如果你想要Without join keyword
!!,你可以这样做:
select *
from your_table t
where (computerID, ScanDate) in
(
select computerID, max(ScanDate)
from your_table t1
where t1.computerID=t.computerID
)