sql - 选择相关表中第一行和最后一行的总和
问题描述
在我的表中,我有这三个表:
团队:
Id GUID UNIQUE PRIMARY
Name NVARCHAR
参与者:
Id GUID UNIQUE PRIMARY
FirstName NVARCHAR
[....]
TeamId GUID
参与者资料:
Id GUID UNIQUE PRIMARY
Weight FLOAT
Date DATETIME
ParticipantId GUID
TeamId GUID
我需要的是一个 SQL 查询,它为我提供了 Teams 中的所有列,并且:
团队中参与者 (TeamId) 的 ParticipantData 中第一个(按日期排序)条目的总和
团队中参与者 (TeamId) 的 ParticipantData 中最后(按日期排序)条目的总和
解释:
我有很多参与者(团队成员)每隔一段时间(体重+日期)报告他们的体重。我想要完成的是计算所有团队成员的体重减轻。
在 2019-01-03 参与者 1 报告体重 78
2019-01-06 参与者 1 报告体重 75
在 2019-01-04 参与者 2 报告体重 86
于 2019-01-07 参与者 2 报告体重 83
我需要查询来获得 SumOfFirstWeights (78 + 86) = 164
我需要查询来获取 SumOfLastWeights (75 + 83) = 158
这让我减重了6。
我尝试了很多组合:
Select *,
(SELECT TOP (1) Sum(Weight)
FROM ParticipantData WHERE (TeamId = Teams.Id)
GROUP BY ParticipantId
)
ORDER BY Date As SumOfFirstWeights
From Teams
解决方案
您的问题是每组的某种最大/最低值,此外,您需要这些值的总和。
select t.id, t.name, sum(t1.weight), sum(t2.weight)
from teams t
left join
(
select pd.teamid, pd.participantid, pd.weight
from ParticipantData pd
join
(
select teamid, participantid, min(date) min_date
from ParticipantData
group by teamid, participantid
) t on pd.teamid = t.teamid and
pd.participantid = t.participantid and
pd.date = t.min_date
) t1 on t.id = t1.teamid
left join
(
select pd.teamid, pd.participantid, pd.weight
from ParticipantData pd
join
(
select teamid, participantid, max(date) max_date
from ParticipantData
group by teamid, participantid
) t on pd.teamid = t.teamid and
pd.participantid = t.participantid and
pd.date = t.max_date
) t2 on t1.teamid = t2.teamid and
t1.participantid = t2.participantid
group by t.id, t.name
推荐阅读
- python - 如何使用 python 文件系统将文本放在单独的行上?
- python - 遍历数据帧的字典以获取具有选定列的数据帧的子集
- sapui5 - 如何使用 Uploadset 实现挂起的附件?
- sharepoint - 来自 Sharepoint 的访问令牌
- node.js - TypeError:无法读取未定义命令处理程序的属性“集”
- javascript - 如何在 amCharts 中为 lineSeries 设置 startLocation?
- reactjs - 仅在页面加载/刷新时运行功能,而不是在通过路由更改安装应用程序时
- javascript - 在 moment.js 中返回错误的月份日期
- python - 需要在 MacOS 中使用 ioreg 通过 Python 获取 USB 序列号?
- .net - 将 XML 反序列化为类列表会导致异常