SQL根据一些选定的列从单个表中删除重复项

时间:2015-10-09 13:01:41

标签: sql

我遇到了一个有趣的情况,我希望通过一个简单的查询可以解决...但我无法设法形成查询......

table    
node trigger value date
A    A3      5     2016-01-12 00:00:00
A    A1      4     2016-01-12 00:00:00
B    B2      3     2016-01-12 01:00:00
A    A3      1     2016-01-13 00:00:00
  • 在每个节点上显示最新发生的触发,并在上表中显示相应的值。
  • 节点触发器应按字母顺序排序

这是我最接近查询的地方。

SELECT DISTINCT(node, trigger), value 
FROM table 
ORDER BY node, trigger, date DESC;

我希望DISTINCT在节点 / 触发器对上执行。显示多个节点 / 触发器对,因为它们具有不同的,即不唯一,因此不会被DISTINCT删除。添加GROUP BY似乎没有帮助。上表中查询的答案应该是这样的......

node trigger value 
A    A1      4    
A    A3      1     
B    B2      3         

2 个答案:

答案 0 :(得分:0)

我通常使用基表中的最大数据值创建一个子集,从而创建一组只有最大日期和节点。然后连接回基集以获得所需的其余值。

在这种情况下,我创建了一个内联视图,它是每个节点都有最大日期的集合。

SELECT A.node, A.trigger, A.value
FROM table A
INNER JOIN (Select node, max(date) as MDate From Table GROUP BY node) B
  on B.Node = A.Node
 and B.MDate = A.Date 
ORDER BY A.Node, A.Tigger

根据rdbms,可能需要转义触发器列。使用rdbms方法

区别不起作用

答案 1 :(得分:0)

即使日期在SQL-Server中起作用至少

,这也会给你不同
SELECT t.node, t.[trigger], (SELECT TOP 1 value from [Table] t2 where t2.node=t.node and t2.[trigger]=t.[trigger] order by [date] desc)
FROM
(SELECT DISTINCT node, [trigger]
FROM  [Table]) as t