为另一列的每个值选择一列的顶部 1
Posted
技术标签:
【中文标题】为另一列的每个值选择一列的顶部 1【英文标题】:Selecting the top 1 of one column, for each value of another column 【发布时间】:2021-03-18 16:17:16 【问题描述】:我们有针对中学生的报告周期。我正在尝试编写一个查询,该查询将创建一个简洁的小表格,显示我们每个中学年的最新报告周期。
我找到了一种方法来展示我想要的东西,但它使用 UNION 并且似乎应该有一种更有效的方法。
所以目前我重复使用了 7 次,更改了 WHERE 子句,因此 SchoolYear 更改为我们需要的每个(7 到 13):
SELECT *
FROM
(SELECT TOP 1
CycleAllocations.ReportCycle,
CycleAllocations.SchoolYear,
CycleDetails.ReportName
FROM CycleAllocations
LEFT OUTER JOIN CycleDetails
ON CycleAllocations.ReportCycle = CycleDetails.ReportCycle
WHERE SchoolYear = 7
ORDER BY intReportCycle DESC) AS CYCLE7
UNION
SELECT *
FROM
(SELECT TOP 1
CycleAllocations.ReportCycle,
CycleAllocations.SchoolYear,
CycleDetails.ReportName
FROM CycleAllocations
LEFT OUTER JOIN CycleDetails
ON CycleAllocations.ReportCycle = CycleDetails.ReportCycle
WHERE SchoolYear = 8
ORDER BY intReportCycle DESC) AS CYCLE8
UNION... etc etc
这会产生一个像这样的表格:
ReportCycle | SchoolYear | ReportName |
---|---|---|
173 | 7 | Short Report March 2021 |
173 | 8 | Short Report March 2021 |
173 | 9 | Short Report March 2021 |
173 | 10 | Short Report March 2021 |
174 | 11 | Yr11 Mock Exams Jan 2021 |
172 | 12 | Long Report March 2021 |
175 | 13 | U6 Mock Exams Jan 2021 |
有没有更好的写法?
【问题讨论】:
【参考方案1】:您可以尝试一下,它可能需要调整,因为您尚未共享表架构或任何示例数据。
使用行号函数对排序的行进行编号,以便您的 top1 行获得数字 1,并为每个学年的每个“分区”重复该行,然后只返回数字为 1 的行。
我也使用了表别名,这使查询更简洁,更易于阅读。
select ReportCycle, SchoolYear, ReportName from (
select ca.ReportCycle, ca.SchoolYear, cd.ReportName, Row_Number() over (partition by schoolyear order by intReportCycle desc )
from CycleAllocations ca
left join CycleDetails cd on ca.ReportCycle = cd.ReportCycle
)x
where rn=1
order by SchoolYear
【讨论】:
就是这个!只需要在其中添加一个 WHERE 子句来指定我想要的 7 年,结果就完美了。谢谢哥们!以上是关于为另一列的每个值选择一列的顶部 1的主要内容,如果未能解决你的问题,请参考以下文章