使用mysql我试图用一个在特定时间内没有出现的设备列表(serialno)显示结果(last_seen),然后只显示具有max(last_seen)的唯一设备。 last_seen是一个init值,它是一个在没有看到设备时递增(想想分钟)的数字。想象一个表有一行serialno“L123”,其中last_seen为“1”,然后又过了一分钟,serialno“L123”,last_seen为“2”,等等。使用max(last_seen),结果应显示最高数字或最后一次看到设备。
到目前为止工作,但我注意到设备serialno L123将在哪里显示两次,如何过滤结果只显示最高的last_seen?我尝试了两种使用distinct的方案,但它们似乎都不起作用。
作为我得到的(不工作)的一个例子
email | serialno | Last seen (min)
abc@example.com | L123 | 30
abc1@example.com | K900 | 20
abc2@example.com | L123 | 1 <--yes the email is different but same serialno
作为想看的内容的一个例子
email | serialno | Last seen (min)
abc@example.com | L123 | 30
abc1@example.com | K900 | 20
场景1:在where子查询中选择distinct
SELECT
email,
serialno,
max(last_seen)
FROM
my_table
WHERE
last_seen IN (SELECT last_seen FROM my_table WHERE last_seen > 0)
AND
serialno IN (SELECT distinct serialno FROM my_table)
GROUP BY
2,1
ORDER BY
3 DESC
场景2:在分组后使用拥有
SELECT
email,
serialno,
max(last_seen)
FROM
my_table
WHERE
last_seen IN (SELECT last_seen FROM my_table WHERE last_seen > 0)
GROUP BY
2,1
HAVING
serialno in (SELECT distinct serialno FROM my_table)
ORDER BY
3 DESC
答案 0 :(得分:1)
JOIN
,用于查找每个serialno的max last_seen值:
select t1.*
from my_table t1
join (select serialno, max(Last_seen) Last_seen
from my_table
group by serialno) t2
on t1.serialno = t2.serialno and t1.Last_seen = t2.Last_seen
order by t1.Last_seen desc
答案 1 :(得分:0)
Distinct适用于您实际想要输出的值。如果在子选择中使用它,则还必须过滤子选择中的唯一值。
虽然在第一个查询中只按serialno分组。您只想获得serialno的分组结果。你不需要in子句或者有。