【问题标题】:How to group by and select corresponding row values?如何分组并选择相应的行值?
【发布时间】:2020-09-28 23:59:49
【问题描述】:

首先,我使用的是 SSMS 2018。我正在尝试创建一个公用表表达式,以便稍后在某些代码中使用。我需要在每人每个适用的季度减少一行,我尝试使用 Haves/Group Bys 和 wheres,但我无法获得正确的结果集。我目前拥有的是这样的表格:

Total Cookies(DurableKey(Int), QuarterEndDateOfStartQuarter(Date), QuarterEndDate(Date), totalCookies (Int), NumberofDays(Int))

持久键代表一个人加班。

QuarterEndDateOfStartQuarter 代表某些要求的第一个适用季度,即在该季度的一天内至少吃了 10 个 cookie

QuarterEndDate 代表当前季度,在 QuarterEndDateOfStartQuarter 之后最多 3 个季度

TotalCookies 表示自开始季度开始以来已吃掉的饼干

NumberofDays 表示自开始季度开始以来食用 cookie 的天数。

数据看起来像这样:

DurableKey QuarterEndDateOfStartQuarter QuarterEndDate totalCookies NumberofDays
99999   2018-06-30  2018-06-30  1410.000    17
99999   2018-06-30  2018-09-30  6564.000    91
99999   2018-06-30  2018-12-31  8174.000    154
99999   2018-06-30  2019-03-31  9554.000    161
99999   2018-09-30  2018-09-30  5154.000    74
99999   2018-09-30  2018-12-31  6764.000    137
99999   2018-09-30  2019-03-31  8144.000    144
99999   2018-09-30  2019-06-30  10091.000   188
99999   2019-03-31  2019-03-31  1380.000    7
99999   2019-03-31  2019-06-30  3327.000    51
99999   2019-03-31  2019-09-30  3357.000    52
99999   2019-03-31  2019-12-31  3357.000    52
99999   2019-06-30  2019-06-30  1695.000    30
99999   2019-06-30  2019-09-30  1725.000    31
99999   2019-06-30  2019-12-31  1725.000    31
99999   2019-06-30  2020-03-31  2917.500    74

我想最终得到一个 CTE,它具有人 - 季度粒度而不是人 - 开始季度 - 季度。所以表格会有列:

Cookies(DurableKey(Int), QuarterEndDate(Date), totalCookies (Int), NumberofDays(Int))

如果有重叠的行,数据将从之前的 QuarterEndDateOfStartQuarter 对应的行中提取:

DurableKey QuarterEndDate totalCookies NumberofDays
99999       2018-06-30  1410.000    17
99999       2018-09-30  6564.000    91
99999       2018-12-31  8174.000    154
99999       2019-03-31  9554.000    161
99999       2019-06-30  10091.000   188
99999       2019-09-30  3357.000    52
99999       2019-12-31  3357.000    52
99999       2020-03-31  2917.500    74

我觉得这应该很简单,但一直没能完成。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    使用row_number 按由键和季度分区的 QuarterEndDateOfStartQuarter 列排序。然后为每个分区选择第一个排序的。

    select  DurableKey, QuarterEndDateDate, totalCookies, NumberofDays
    from    (
                select  *,
                        ord = row_number() over(
                            partition by durableKey, quarterEndDateDate 
                            order by QuarterEndDateOfStartQuarter
                        )
                from    @totalCookies
            ) tk
    where   ord = 1
    

    【讨论】:

    • 是的,我忘记了 Row_number。这就是我需要的谢谢 pwilcow!
    猜你喜欢
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2022-01-15
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多