SQL - Distinct One Col,选择多个其他?

时间:2012-06-14 10:22:34

标签: sql sql-server-2005 distinct

我一直试图低估编写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...

任何帮助/指针都会很棒!欢呼声。

2 个答案:

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