根据最近的日期从多个相似的行中选择一行

Posted

技术标签:

【中文标题】根据最近的日期从多个相似的行中选择一行【英文标题】:Selecting one row from multiple similar ones based on most recent date 【发布时间】:2014-10-20 14:05:25 【问题描述】:

我有一个结构如下的表格:

客户名称、日期A、日期B、日期C

DateA<=DateB<=DateC.

客户有时会被多次列出,每个 DateA、DateB 和 DateC 的日期都不同。

所以如果我的数据看起来像:

X, 10/01, 10/02, 10/03
X, 10/04, 10/05, 10/06
X, 10/05, 10/07, 10/08
Y, 10/01, 10/05, NULL
Y, 10/01, 10/06, NULL
Z, 10/02, NULL,  NULL
Z, 10/03, 10/04, NULL

我想要:

X, 10/05, 10/07, 10/08
Y, 10/01, 10/06, NULL
Z, 10/03, 10/04, NULL

换句话说,我希望每个客户在流程中走得最远的一行,其中 dateA、dateB 和 dateC 是流程中的里程碑。

如果两行是同一客户且处于同一里程碑,我只想选择日期最远的那一行。

我使用的是 Teradata 14.10。

对 SQL 相当陌生,因此我们将不胜感激。

【问题讨论】:

您使用的是哪个 DBMS?后格雷斯?甲骨文? DB2?火鸟? 抱歉:我们使用的是 Teradata。 哪个 Teradata 版本?如果 dateC 为 NULL,应该返回哪些行? 我们使用的是 Teradata 14.10。我更新了问题以提供更多详细信息。提前致谢。 【参考方案1】:

这将返回您的预期结果:

select * from tab
qualify
   row_number()
   over (partition by customer_name
         order by dateC desc, dateB desc, dateA desc) = 1

【讨论】:

谢谢!效果很好!我将不得不研究这个命令。希望我能投票给你。

以上是关于根据最近的日期从多个相似的行中选择一行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL,根据列值从不同的行中选择

按列分组并选择具有多个最小值的行中的所有字段

窗口函数——选择最近的一行

如何在动态创建的行中添加日期选择器

SQL Server:根据多个条件从组中选择特定行

选择连接表上的最近日期