![](/img/trans.png)
[英]SQL server 2008 R2, select one value of a column for each distinct value of another column
[英]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,以便更好地理解。
谢谢
编辑
目的是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
编辑:
由于在原始查询中使用的代码没有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
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.