如何比较组中的行?
Posted
技术标签:
【中文标题】如何比较组中的行?【英文标题】:How to compare rows in groups? 【发布时间】:2015-11-20 22:01:19 【问题描述】:我有一张如下表:
INS_SEQ | NAME | DATE
-----------------------------
1 | willy | 15/11/10
2 | zoe | 15/11/20
3 | willy | 15/11/20
4 | willy | 15/11/10
5 | willy | 15/11/21
6 | zoe | 15/11/17
7 | willy | 15/11/12
8 | zoe | 15/11/20
9 | zoe | 15/11/30
... and other values ...
按NAME
列分组返回:
INS_SEQ | NAME | DATE
----------------------------
1 | willy | 15/11/10
3 | willy | 15/11/20
4 | willy | 15/11/10
5 | willy | 15/11/21
7 | willy | 15/11/12
2 | zoe | 15/11/20
6 | zoe | 15/11/17
8 | zoe | 15/11/20
9 | zoe | 15/11/30
我想得到一个结果,对于相同的值,NAME
上一个日期大于下一个日期(换句话说,我希望看到满足上一个插入日期的那些行少于 Reg 相同名称)。
如何实现?
我的预期输出是:
NAME | DATE
-----------------
willy | 15/11/20
willy | 15/11/21
zoe | 15/11/20
zoe | 15/11/17
zoe | 15/11/30
【问题讨论】:
按日期列排序 但其他日期的值'保留,如果不符合比较算法,则不知道从组中取多少行 您希望行 1 'Willy 15/11/10'等行发生什么? 如果您正在寻找每个名称出现一次的每个唯一日期,请使用:选择不同的名称,从表中选择日期。如果要对其进行排序,请添加 order by,例如: order by name, date 我想稍后显示添加到表中的行,对于错误类型的每个组,上一个日期大于下一个日期。 【参考方案1】:首先,您必须编写一个查询来查找不按顺序排列的日期,然后确保不包括最后一条同名记录。
-- Finding dates which are not in order
(SELECT * FROM CompareRows C1 WHERE EXISTS
(SELECT * FROM CompareRows C2
WHERE C2.ID < C1.ID
AND C2.OrderDate < C1.OrderDate
AND C2.Name = C1.Name))
EXCEPT
-- Not including last record with same name
(SELECT C1.*
FROM CompareRows C1 LEFT JOIN CompareRows C2
ON (C1.name = C2.name AND C1.ID < C2.ID)
WHERE C2.ID IS NULL)
这是现场演示 http://www.sqlfiddle.com/#!6/51865/1/0
【讨论】:
并进入按组排序的第二列行,我希望这些行不适合有人在同一组中插入前一个日期的旧数据行的方案,我应该给你其他列,这样你就可以理解它是什么我明天将尝试查看表格的其他列并举例说明 @wsmx ,如果您明天提供更多信息会有所帮助 好的,非常感谢您的兴趣,我的问题不完整,可能有一个键可以识别一个接一个地插入我需要对名称进行分组,然后在日期之后以某种方式比较这是早期的关键 我更新有问题的数据。 如果这是您的输出的要求,则不应包含 Zoe 15/11/17 和 Zoe 15/11/30,因为它们的上一个日期不大于下一个日期。听起来不错?以上是关于如何比较组中的行?的主要内容,如果未能解决你的问题,请参考以下文章
从Oracle SQL中的每个组中选择具有最大值的行[重复]