SQL select TOP按多列中的一对列记录分区

问题描述 投票:0回答:1

例如,我需要选择每个区域的前2位客户(没有property列,并且每个客户都具有各种属性,例如

区域|客户|物业|费用

area1 | cus1 |物业11 | cost11

area1 | cus1 | property12 | cost12

area1 | cus2 |物业21 | cost21

通常,下面的SQL语句很好,但是这次table是复杂的嵌套SQL语句,所以我想知道是否有更好的方法来简化它?(如果cus1在TOP2中,则需要所有属性。)] >

thx以获取任何解决问题的建议或链接。

SELECT
    area,
    customer,
    property,
    SUM(cost) AS cost
FROM
    table
WHERE
    customer IN
             (SELECT
                  f.customer
             FROM
                 (SELECT
                      p.area,
                      p.customer,
                      ROW_NUMBER() OVER(PARTITION BY area ORDER BY cost) AS number,
                      p.cost
                 FROM(SELECT
                          area,
                          costomer,
                          SUM(cost) AS cost
                     FROM
                         table
                     GROUP BY
                         costomer
                     )p
             WHERE number <=2)A
            )
GROUP BY
    area,
    customer,
    property

例如,我需要选择每个区域的前2位客户(不包含属性列),并且每个客户都具有诸如area |客户|物业|成本区域1 | cus1 | ...

sql group-by partition
1个回答
1
投票

您可以使用ROW_NUMBER()窗口功能(或如果要包含领带,可以使用RANK():]

© www.soinside.com 2019 - 2024. All rights reserved.