在选择不同的行时提供额外的数据
Posted
技术标签:
【中文标题】在选择不同的行时提供额外的数据【英文标题】:Providing additional data when selecting distinct rows 【发布时间】:2010-07-21 16:39:57 【问题描述】:我有一个来自 Active Directory 的登录事件表。其中一种类型的事件是机器登录,其中包括进行登录的机器的 IP 地址。这很方便,因为它提供了一种带时间戳的方法来确定在给定时间哪台机器在哪个 IP 上。我正在尝试构建一个查询,该查询将为我提供机器首次登录到 IP 的时间戳列表(感谢 DHCP,IP 是可变的)。
如果机器拥有 IP 地址,则只返回列表的查询很简单。
SELECT DISTINCT IP
FROM EventStream
WHERE (Machine='$Machine')
我知道“选择不同”是一个非最佳查询,这就是为什么我要寻找更好的东西。这可能包括子查询,我对此知之甚少。在这种情况下不提供 'Distinct' 会返回一个最多包含 2000 行的表,因此会选择很多数据而不使用。
我真正想要的是某种方式来表达一个查询,这样我就可以得到一个机器第一次出现在 IP 地址上的时间戳列表。我可以通过在第一个结果上迭代这个查询来在代码中伪造它:
SELECT TOP 1 DateTime
FROM EventStream
WHERE (Machine='$Machine' and IP='$IP')
ORDER BY DateTime
我很确定这两个可以组合成一个大统一查询。这可能吗,还是我应该坚持使用应用程序逻辑来提供我正在寻找的东西?
【问题讨论】:
【参考方案1】:只是为了确认一下,您想查看机器使用过的所有 IP 地址以及它第一次出现在每个 IP 地址上的时间吗?
如果是这样,您应该能够执行以下操作:
SELECT IP, max(DateTime) as DateTime
FROM EventStream
WHERE Machine='$Machine'
GROUP BY IP
【讨论】:
用“min”代替“max”可以满足我的需要。虽然 min/max 方法会告诉我它在那个 IP 上的时间,这在另一个领域也很有用。这家伙的运行时间与返回 2000 行相当。但是......它给出了正确的输出!【参考方案2】:聚会有点晚了,但这会做你想做的事,而不需要先找到 IP,然后循环查找你想要的信息:
SELECT Machine,
IP,
Date
FROM (SELECT Machine,
IP,
Date,
ROW_NUMBER() OVER (PARTITION BY Machine, IP ORDER BY Date DESC) RN
FROM EventStream) EventStream
WHERE RN = 1
这将为您提供 Eventstream 中所有机器的所有 IP,并根据日期列仅返回每个机器的最后日期 (ORDER BY Date DESC)。如果您想要第一个日期,只需从 order by 中删除“DESC”即可。
【讨论】:
子查询的好例子。这个我也可以用!谢谢!以上是关于在选择不同的行时提供额外的数据的主要内容,如果未能解决你的问题,请参考以下文章
多次调用 AlarmManager.setRepeating 提供相同的 Intent/PendingIntent 额外值,但我提供了不同的值