我一直试图低估编写MS SQL 2005查询的最佳方法,该查询几乎可以执行以下操作...
select distinct col1, col2, col3
from table1
基本上我想在col1上执行Distinct但我不想在Col2 / 3上使用Dististinc,我只想要有值。
我理解不可能以这种方式编写查询,因为我认为我读过Distinct应用于行而不是col?
有谁能请我指出正确的方向?我确实尝试了将值重新加入,但这并不起作用,因为我必须在distinct select中指定额外的连接cols,而这些cols依次对这些cols执行不同的操作,即..
select distinct t1.col1, t2.col2, t3.col3
from table1 t1
right join (select col1, col2, col3 from table1) t2
on t1.col1 = t2.col1
编辑解释得更好..
select distinct t1.Hostname, t2.IP, t2.ActionDateTime, t2.Action
from tblUserActions t1
right join (select Hostname, IP, ActionDateTime from tblUserActions) t2
on t1.Hostname = t2.Hostname
基本上这个表是一个包含数千个用户操作的列表,我试图在主机名上列出不同的内容,因此我只应该收到10行,因为那里有多少个不同的主机名。然后基于这些主机名我想将最新的记录数据加入到返回的行中,所以我想返回:
Hostname, IP, ActionDateTime, Action
1 Host1, 165.123.123.1, 2012-06-14 02:07:08, Logon
2 Host2, 165.123.123.2, 2012-06-14 03:07:08, Logoff
3 Host3, 165.123.123.3, 2012-06-14 04:07:08, Logon
4 Host4, 165.123.123.4, 2012-06-14 05:07:08, Logoff
etc...
任何帮助/指针都会很棒!欢呼声。
答案 0 :(得分:1)
听到它的声音,我认为这就是你所追求的:
WITH CTE AS
( SELECT HostName,
IP,
ActionDate,
Action,
ROW_NUMBER() OVER(PARTITION BY HostName ORDER BY ActionDate DESC) AS RowNumber
FROM Table
)
SELECT HostName,
IP,
ActionDate,
Action
FROM CTE
WHERE RowNumber = 1
这将只返回主机名的唯一值,然后返回的值其他列基于ORDER BY
窗口函数中的ROW_NUMBER()
子句。
您可能需要更改ORDER BY
以满足您的确切要求,我认为最近的行动可能是最有可能的。
答案 1 :(得分:1)
您是否只想要每个主机名/ ip的最新操作?
你可以这样做:
with latestAction as (
select hostname,
ip,
max(ActionDate) as latestActionDate
from tblUserActions
group by hostname,
ip)
select la.hostName,
la.ip,
tua.ActionDate,
tua.Action
from tblUserActions tua join latestAction la on
tua.hostname = la.hostname and
tua.ip = la.ip and
tua.ActionDate = la.latestActionDate