sql - 如何根据多个字段选择最大值并按多个字段分组
问题描述
请协助完成以下工作。样本数据:
LOCATION ITEMNO TRANSDATE DAYENDSEQ ENTRYSEQ LINENO ANSWER
Area1 A 20180702 1 1 1 a
Area1 A 20180703 1 1 1 b
Area1 A 20180703 2 1 1 c
Area1 A 20180703 2 2 1 d
Area1 A 20180703 2 2 2 e
Area1 B 20180703 1 1 1 f
Area1 C 20180703 1 1 2 g
Area1 C 20180703 1 1 1 h
Area2 A 20180703 1 2 1 i
Area2 A 20180703 1 1 4 j
Area2 A 20180703 1 1 5 k
返回每个位置的每个项目的 ANSWER 值,其中 TRANSDATE、DAYENDSEQ、ENTRYSEQ 和 LINENO(按此顺序)的组合最大。
LOCATION ITEMNO TRANSDATE DAYENDSEQ ENTRYSEQ LINENO ANSWER
Area1 A 20180703 2 2 2 e
Area1 B 20180703 1 1 1 f
Area1 C 20180703 1 1 2 g
Area2 A 20180703 1 2 1 i
解决方案
使用 ANSI 标准row_number()
函数:
select t.*
from (select t.*,
row_number() over (partition by location, itemno
order by transdate desc, dayendseq desc, entryseq desc, lineno desc
) as seqnum
from t
) t
where seqnum = 1;
推荐阅读
- apache-kafka - 在基于 Windows 的 C# 和基于 Linux 的 Java 应用程序之间进行通信的更快、最可靠的方式是什么?
- c# - 我可以将当前实例转换为 C# 中的通用类型吗?
- c++ - 部分特化可以引用特化的参数列表中的 sizeof(T) 吗?
- php - 即使未使用计数器,此循环如何工作?
- php - 是否可以在 PHP 的包含文件中包含文件
- sql - 子查询返回多于一行并有助于逻辑公式化
- java - 如何在构建时将类添加到 Quarkus 类加载器
- python - 使用 Python 请求模块将数据插入 MariaDB 时出错
- r - 使用 dplyr 更改特定列中阈值以下的值
- c++ - 异步网络服务器:如何使用变量作为路由创建 server.on