选择具有最大值的行,其中两列中的值相同

时间:2014-12-01 04:07:49

标签: sql sql-server-2008

我有一个像这样的简单表

....................................
| hotelNo | roomType | totalBooking |
....................................
| 1       | single   |    2         |
| 1       | family   |    4         |
| 2       | single   |    3         |
| 2       | family   |    2         |
| 3       | single   |    1         |
.....................................

现在我想获得每个酒店最常订的房型,即以下结果

......................
| hotelNo | roomType |
......................
|  1      | family   |
|  2      | single   |
|  3      | single   |
......................

P.S我使用子查询来获取第一个表

3 个答案:

答案 0 :(得分:5)

如果您想要最大值,可以使用窗口函数:

select hotelNo, roomType
from (select t.*, row_number() over (partition by hotelNo order by totalBooking desc) as seqnum
      from table t
     ) t
where seqnum = 1;

答案 1 :(得分:1)

样本表

SELECT * INTO #TEMP
FROM
(
    SELECT 1 HOTELNO ,'SINGLE' ROOMTYPE ,2 TOTALBOOKING
    UNION ALL
    SELECT 1,'FAMILY',4
    UNION ALL
    SELECT 2,'SINGLE',3
    UNION ALL
    SELECT 2,'FAMILY',2
    UNION ALL
    SELECT 3,'SINGLE',1
)TAB

结果查询

;WITH CTE1 AS
(
   SELECT HOTELNO,ROOMTYPE,TOTALBOOKING,
   MAX(TOTALBOOKING) OVER (PARTITION BY HOTELNO) MAXX
   FROM #TEMP
)
SELECT DISTINCT HOTELNO,ROOMTYPE,MAXX
FROM CTE1 
WHERE TOTALBOOKING=MAXX

答案 2 :(得分:1)

另一种方法是使用聚合函数Max

SELECT A.hotelNo,
       A.roomType,
       A.totalBooking
FROM   tablename A
       JOIN (SELECT Max (totalBooking) totalBooking,
                    hotelNo
             FROM   tablename
             group by hotelNo) B
         ON a.totalBooking = b.totalBooking
            AND a.hotelNo = b.hotelNo 

SQL FIDDLE DEMO