为另一列的每个值选择一列的顶部 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的主要内容,如果未能解决你的问题,请参考以下文章

Python:在一列中为另一列中的单个值显示多个值

根据另一列的值选择列

Excel2016 表格中怎么把某一列单元格多行相同文字中一个特定文字替换为另一列的多行不同文字?

对于每个类别,如何找到与另一列的最小值对应的列的值?

为另一列中的每个值选择一列中的最大值[重复]

根据来自另一列的不同值计算值