SQL选择计数最高的行

SQL选择计数最高的行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图根据两个字段仅选择计数最高()的行 首先,我有一个查询,它给我一个特定的ITEM-SUPPLIER组合在我的表中出现了多少次的值 select itemid, ordersupplierid, COUNT(OrderSupplierId) AS SupCount from purchaseorderline group by itemid, ordersupplierid order by ItemID 在结果中,我有: itemid | ordersupplierid | SupC

我试图根据两个字段仅选择计数最高()的行

首先,我有一个查询,它给我一个特定的ITEM-SUPPLIER组合在我的表中出现了多少次的值

select itemid, ordersupplierid, COUNT(OrderSupplierId) AS SupCount from purchaseorderline
group by itemid, ordersupplierid
order by ItemID
在结果中,我有:

itemid   | ordersupplierid | SupCount
15850    |  579            |  1
15850    |  587            |  3
15850    |  605            |  2
15851    |  616            |  5
15852    |  579            |  1
15852    |  587            |  2
15854    |  616            |  11
15855    |  616            |  1
因此,从那里我只需要获得行:

itemid   | ordersupplierid | SupCount
15850    |  587            |  3
15851    |  616            |  5
15852    |  587            |  2
15854    |  616            |  11
15855    |  616            |  1
正如在ItemId-OrderSupplierId组合中一样,SupCount最高


有人知道怎么做吗?非常感谢。

您可以使用窗口功能:

select itemid, ordersupplierid, supcount
from (select itemid, ordersupplierid, count(*) AS SupCount,
             max(count(*)) over (partition by itemid) as maxcount
      from purchaseorderline
      group by itemid, ordersupplierid
     ) io
where supcount = maxcount
order by ItemID;
如果存在连接,则将返回所有匹配的行。如果您只需要一行(即使有结),则可以使用
row\u number()


我建议使用窗口功能:

WITH cte AS(
  select itemid, ordersupplierid, COUNT(OrderSupplierId) AS SupCount
  from purchaseorderline
  group by itemid, ordersupplierid
  order by ItemID
),
cteFilter AS(
SELECT itemid, ordersupplierid, SupCount, ROW_NUMBER() OVER (PARTITION BY itemid ORDER BY SupCount DESC) rn
  FROM cte
)
SELECT itemid, ordersupplierid, SupCount
  FROM cteFilter
  WHERE rn = 1
WITH cte AS(
  select itemid, ordersupplierid, COUNT(OrderSupplierId) AS SupCount
  from purchaseorderline
  group by itemid, ordersupplierid
  order by ItemID
),
cteFilter AS(
SELECT itemid, ordersupplierid, SupCount, ROW_NUMBER() OVER (PARTITION BY itemid ORDER BY SupCount DESC) rn
  FROM cte
)
SELECT itemid, ordersupplierid, SupCount
  FROM cteFilter
  WHERE rn = 1