【问题标题】:SQL: get A with max B for every distinct CSQL:为每个不同的 C 获取具有最大 B 的 A
【发布时间】:2014-11-09 15:42:15
【问题描述】:

在我的示例中,我有一个包含不同场所信息的表格,其中包含cityvenue_namecapacity 的列。我需要为每个citycapacity 最高的场地选择cityvenue_name。所以如果我有数据:

城市|场地 |容量 洛杉矶 |场地1 | 10000 洛杉矶 |场地2 | 20000 纽约 |场地3 | 1000 纽约 |场地4 | 500

...查询应该返回:

洛杉矶 |场地2 纽约 |场地3

谁能给我关于如何在 SQL 中完成这个查询的建议?我陷入了连接和嵌套查询中:P。谢谢!

【问题讨论】:

  • 首先,编写一个查询,找到按城市分组的最大容量,然后查询与该城市和容量匹配的场所...

标签: mysql sql sqlite greatest-n-per-group


【解决方案1】:

您可以使用外部应用对这些值进行排序并将结果返回到您的主查询。

http://www.codeproject.com/Articles/607246/Making-OUTER-and-CROSS-APPLY-work-for-you

另一种选择是使用 RowNum() 函数。 http://msdn.microsoft.com/en-us/library/ms186734.aspx

SELECT 
  v.city, 
  Ranked.Venue,
  Ranked.Capacity   
FROM Venues v WITH (NOLOCK) 
   Outer Apply 
        ( 
           SELECT TOP 1 
                Venue, Capacity
            FROM Venues Ranked WITH (NOLOCK) 
            WHERE v.City = Ranked.City 
            ORDER BY Capacity DESC 
         ) as Ranked 
 GROUP BY 
     v.city,
     Ranked.Venue,
     Ranked.Capacity 

【讨论】:

    【解决方案2】:

    常见的方法是使用带有max 的子查询将join 表返回到自身:

    select y.city, y.venue_name
    from yourtable y
        join (select city, max(capacity) maxcapacity
              from yourtable
              group by city
        ) t on y.city = t.city and y.capacity = t.maxcapacity
    

    【讨论】:

      【解决方案3】:

      一种方法是使用not exists

      select i.*
      from info i
      where not exists (select 1
                        from into i2
                        where i2.city = i.city and i2.capacity > i.capacity);
      

      【讨论】:

        【解决方案4】:
        select t.city, t.venue
          from tbl t
          join (select city, max(capacity) as max_capacity from tbl group by city) v
            on t.city = v.city
           and t.capacity = v.max_capacity
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-17
          • 1970-01-01
          • 2014-12-24
          • 2017-06-30
          • 1970-01-01
          • 2014-03-29
          • 1970-01-01
          相关资源
          最近更新 更多