如何从SQL表中的最高值获取额外信息?

时间:2015-04-02 09:39:16

标签: mysql sql

我有一个包含3列的表:

computerID 
ScanDate
vulnerability level. 

我希望按 computerID 进行分组,并获取最新 scanDate 的漏洞级别,而无需添加内部联接(该表非常大)。

有可能吗?

3 个答案:

答案 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
        )

SQLFIDDLE DEMO