1

我一直试图低估编写 MS SQL 2005 查询的最佳方法,该查询几乎可以执行以下操作...

select distinct col1, col2, col3
from table1

基本上我想在 col1 上执行 Distinct,但我不想在 Col2/3 上执行 Dististinc,我只想要那里的值。

我知道不可能以这种方式编写查询,因为我认为我读到 Distinct 应用于行而不是 col?

谁能指出我正确的方向?我确实尝试将值重新加入,但这没有用,因为我必须在不同的选择中指定额外加入的列,这反过来又在这些上执行不同的,即。

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...

任何帮助/指针都会很棒!干杯。

4

2 回答 2

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以适合您的确切要求,我认为最近的操作可能是最有可能的。

于 2012-06-14T11:09:51.783 回答
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
于 2012-06-14T11:16:54.923 回答