繁体   English   中英

SQL Server 2008中列的不同值

[英]Distinct Value of a column in sql server 2008

您好,我使用左外部联接进行了查询,结果如下表所示:

| 00-00-00-00-00 | 1 | a.txt |
| 00-00-00-00-00 | 2 | b.txt |
| 00-00-00-00-00 | 1 | c.txt |
| 11-11-11-11-11 | 2 | d.txt |

我想要的是下面的MAC列的Distict值是SQL Fiddle,以便更好地理解。

SQLFIDDLE

谢谢

编辑

目的是2和3是无用或冗余的数据,其中1和4是有用的,这意味着1和4在MAC上显示当前文件

输出:

| 00-00-00-00-00 | 1 | a.txt |
| 11-11-11-11-11 | 2 | d.txt |

无法完全回答您的要求。 但是,通常表达您所问问题的人实际上是在问类似“我希望所有列作为仅包含不同MacAddress值的行的示例”之类的问题。 这个问题有很多答案,因为结果是不确定的。 一个简单的解决方案是为每个MacAddress选择第一行(无论“ first”的定义如何):

with cte as (
  select row_number() over (partition by MacAddress order by CounterNo) as rn, *
             from Heartbeats
  )
select * from cte where rn = 1;

如果只想获得不同的macaddress,则可以执行以下操作:

SELECT DISTINCT macaddress FROM heartbeats

如果您希望所有列都与唯一的macaddress并排放置,则需要创建一条规则来获取它们。 下面的查询为您提供了每个macaddress具有最高ID的查询:

SELECT t1.*
FROM heartbeats t1
LEFT JOIN heartbeats t2
    ON (t1.macaddress = t2.macaddress AND t1.id < t2.id)
WHERE t2.id IS NULL

sqlfiddle演示

编辑:

由于在原始查询中使用的代码没有ID列,因此上述查询被细化为:

with cte as (
select ROW_NUMBER() OVER(ORDER BY (Select 0)) AS ID,* from heartBeats
)


SELECT t1.*
FROM cte t1
LEFT JOIN cte t2
    ON (t1.macaddress = t2.macaddress AND t1.id < t2.id)
WHERE t2.id IS NULL

SQL小提琴

SELECT hb1.* FROM [heartbeats] as hb1
       LEFT OUTER JOIN [heartbeats] as hb2   
       ON (hb1.macaddress = hb2.macaddress AND hb1.id > hb2.id) 
         WHERE hb2.id IS NULL;

您必须忽略文件名。 参见http://sqlfiddle.com/#!3/a75e47/13

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM