SQL:查找表中列值最高的位置?

时间:2015-05-24 16:04:40

标签: sql sql-server

我试图通过计算其商品ID的出现次数来查找表中最有序的菜单项。 我尝试了一些不同的东西,但我很丢失。这产生了错误:

  

"聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。"

然而,我认为这会让我想到我想要实现的目标:

SELECT count(itemCode) 
FROM OrderProcessing 
WHERE count(itemCode)=max(count(itemCode))

5 个答案:

答案 0 :(得分:5)

予。原始查询的修改版本 (@DanGuzman评论关系后的更新)

选择与最想要的项目具有相同计数的所有项目:

SELECT itemCode , count(*) as MaxCount
FROM OrderProcessing
GROUP BY itemCode
HAVING count(*) = 
-- count of most wanted item
(select top 1 count(*) 
 from OrderProcessing 
 group by itemCode 
 order by count(*) desc)

II。查询以选择最有序的项目之一

SELECT top 1 itemCode --, count(*) as MaxCount  --optional
FROM OrderProcessing
GROUP BY itemCode
ORDER BY count(*) DESC

答案 1 :(得分:3)

如果你想要一行,我会建议order by

SELECT TOP 1 itemCode, count(itemCode)
FROM OrderProcessing
GROUP BY itemCode
ORDER BY count(itemCode);

如果您想要所有具有最大数量的项目,请使用WITH TIES

SELECT TOP 1 WITH TIES itemCode, count(itemCode)
FROM OrderProcessing
GROUP BY itemCode
ORDER BY count(itemCode);

如果您想要花哨,请使用窗口功能。这是一个例子:

SELECT itemCode, cnt
FROM (SELECT itemCode, count(itemCode) as cnt,
             MAX(count(itemCode)) OVER () as maxcnt
      FROM OrderProcessing
      GROUP BY itemCode
     ) op
WHERE cnt = maxcnt;

答案 2 :(得分:1)

这是另一种方法:

SELECT OP.itemCode
FROM (
    SELECT OP.itemCode, OP.TotalRows, MAX(TotalRows) OVER() AS MaxRows
    FROM (
        SELECT OP.itemCode, COUNT(*) AS TotalRows
        FROM dbo.OrderProcessing AS OP
        GROUP BY OP.itemCode
    ) AS OP
) AS OP
WHERE OP.TotalRows = OP.MaxRows;

它看起来不太漂亮,但它可能会导致更好的执行计划(排序是一个非常耗费资源的条款)。

即使有多个具有相同出现的菜单项,它也应该返回结果。

答案 3 :(得分:1)

我使用此查询来查找出现次数最多的项目:

SELECT t.*
FROM OrderProcessing t
    JOIN
    (SELECT itemCode, ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) seq
    FROM OrderProcessing
    GROUP BY itemCode) dt
    ON t.itemCode= dt.itemCode
WHERE dt.seq = 1

此查询查找最高发生次数:

SELECT MAX(cnt) 
FROM (SELECT COUNT(*) cnt 
      FROM OrderProcessing 
      GROUP BY itemCode) dt 

答案 4 :(得分:1)

包含聚合结果的where子句称为having子句。但是,您无法嵌套聚合函数:Max(Count(*))。

但你可以分层。使用CTE对此有好处:

with
Data( ItemID )as(
    select 1 union all
    select 2 union all
    select 2 union all
    select 3 union all
    select 3 union all
    select 3
),
Sums( ItemID, TotalSold )as(
    select  ItemID, Count( * )
    from    Data
    group by ItemID
)
select  *
from    Sums
where   TotalSold =(
    select Max( TotalSold )
    from    Sums );

这将显示交易次数最多的所有项目。但是,由于这个问题据称是回答的问题,我认为显示所有联系将是正确的结果。如果物品X和Y都卖得最多,提交物品X作为答案,那么暗示所有其他物品,包括物品Y,卖得少。这不是一个正确的答案。我会与你的分析师或任何要求这个结果的人讨论这个问题。