代码之家  ›  专栏  ›  技术社区  ›  szpic

从每个组中选择值最高的记录

  •  0
  • szpic  · 技术社区  · 8 年前

    假设我有这样的桌子:

    客户床垫表:

    Shop        Name        Surname     Adress
    ----------------------------------------------
    SHOP1       name1       surname1    adress1_1 
    SHOP2       name1       surname1    adress1_2 
    SHOP1       name2       surname2    adress2_1 
    SHOP3       name2       surname2    adress2_3 
    SHOP3       name1       surname1    adress1_3 
    

    ShopPriority表:

    Shop   Priority
    ---------------
    SHOP1       1
    SHOP2       2
    SHOP3       3
    

    我正在尝试选择优先级最高的客户地址(重新获得它是商店)

    我写过SQL:

    select ca.shop, ca.name, ca.surname, ca.adress, sp.priority
    from CustomerAdresses ca
    join ShopPriority sp on sp.shop = ca.shop
    group by ca.name, ca.surname, ca.adress, ca.shop, sp.priority
    

    此查询返回如下结果:

    Shop        name        surname     adress    priority
    -------------------------------------------------------
    SHOP1       name1       surname1    adress1_1   1
    SHOP2       name1       surname1    adress1_2   2
    SHOP3       name1       surname1    adress1_3   3
    SHOP1       name2       surname2    adress2_1   1
    SHOP3       name2       surname2    adress2_3   3
    

    现在我已经接近我需要的想法了。 记录按名称和姓氏分组。现在我只需要从具有最高优先级的每个组中获得一个记录。 我试着一组一组地订购记录,但后来整个组都崩溃了。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Yogesh Sharma    8 年前

    row_number()

    select t.*
    from (select ca.shop, ca.name, ca.surname, ca.adress, sp.priority,
                 row_number() over (partition by ca.shop order by sp.priority desc) as seq
          from CustomerAdresses ca join 
               ShopPriority sp 
               on sp.shop = ca.shop
          ) t
    where seq = 1;
    

    top (1) with ties

    select top (1) with ties ca.shop, ca.name, ca.surname, ca.adress, sp.priority
    from CustomerAdresses ca join 
         ShopPriority sp 
         on sp.shop = ca.shop
    order by row_number() over (partition by ca.shop order by sp.priority desc);
    
        2
  •  1
  •   Gordon Linoff    8 年前

    row_number()

    select spc.*
    from (select ca.shop, ca.name, ca.surname, ca.adress, sp.priority,
                 row_number() over (partition by ca.shop order by sp.priority desc) as seqnum
          from CustomerAdresses ca join
               ShopPriority sp
               on sp.shop = ca.shop
         ) spc
    where seqnum = 1;