sql - SQL中如何根据不同的功能实现不同字段的多个join?
问题描述
我有几个表如下。而且,我需要根据每个和列的每个最大级别和最新级别(按日期排序)来获取记录。我正在使用 SQL Server 运行查询。到目前为止,我已经尝试了以下 SQL 查询:ID
Type
select f.ID,x.MAX_LEVEL,f.TYPE, f.DATE
from (
select ID
,TYPE
, MAX(LEVEL) as MAX_LEVEL
from TABLEA
GROUP BY ID, TYPE
) as x
,
(
select ID
,TYPE
, MAX(DATE) as MAX_DATETIME
from TABLEA
GROUP BY ID, TYPE
) as y
inner join TABLEA as f
on f.ID = x.ID and f.LEVEL = x.MAX_LEVEL
inner join TABLEA as g
on f.ID = y.ID and g.DATE = y.MAX_DATETIME
and f.DATE > DATEADD(day, -1, GETDATE())
表
ID TYPE LEVEL DATE
1 ELECTRIC 2 01/06/2019
1 GAS 2 01/06/2019
2 ELECTRIC 2 01/06/2019
3 ELECTRIC 3 01/06/2019
3 ELECTRIC 3 01/06/2019
1 GAS 3 05/06/2019
1 GAS 5 13/06/2019
2 ELECTRIC 5 07/06/2019
3 GAS 5 08/06/2019
6 ELECTRIC 3 02/06/2019
2 ELECTRIC 3 04/06/2019
3 ELECTRIC 3 05/06/2019
2 GAS 10 06/06/2019
2 GAS 3 11/06/2019
3 ELECTRIC 3 11/06/2019
1 ELECTRIC 5 01/06/2019
1 GAS 3 02/06/2019
6 ELECTRIC 5 01/06/2019
1 ELECTRIC 5 10/06/2019
预期结果:
ID TYPE MAX_LEVEL LATEST_LEVEL
1 ELECTRIC 5 5
1 GAS 5 3
2 ELECTRIC 5 5
2 GAS 10 3
3 ELECTRIC 3 3
3 GAS 5 5
6 ELECTRIC 5 3
有什么想法,我怎么能做到这一点?
解决方案
如果你使用的是 sqlserver,你可以试试这个。
SELECT ID, TYPE, MAX(T1.[LEVEL]) AS MAX_LEVEL, X.LEVEL AS LATEST_LEVEL
FROM TABLEA T1
OUTER APPLY (SELECT TOP 1 [LEVEL] FROM TABLEA T2 WHERE T2.ID = T1.ID AND T2.TYPE = T1.TYPE ORDER BY T2.[DATE] DESC) X
GROUP BY ID, TYPE, X.[LEVEL]
ORDER BY ID, TYPE
推荐阅读
- docker - 为什么 docker-compose 突然因 ERROR 内部加载元数据而失败?
- node.js - 在 docker 中监控 Pm2 实例
- python - Kivy 错误:AttributeError:'super' 对象在 self.root.ids 上没有属性 '__getattr__'
- c# - 检查数据库中是否存在字符串 ID NO?
- php - PhpSpreadsheet 在工作表标签标题旁边放了一个数字
- node.js - 如何通过 npm 脚本传递环境变量?
- java - Spring Boot 2 忽略了在 application.yml 中设置的 HikariCP 属性
- nuget - 可以在 Visual Studio 2017 中使用“在构建时生成 Nuget 包”选项吗
- c - Centos7编译问题:致命错误:features.h no such file or directory
- python - 对 keras 输出感到困惑