簡體   English   中英

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

[英]SQL: Find highest occurrence of a column value in a table?

我試圖通過計算其項目ID的出現次數來查找表中最有序的菜單項。 我嘗試了一些不同的東西,但我很丟失。 這產生了錯誤:

“聚合可能不會出現在WHERE子句中,除非它位於HAVING子句或選擇列表中包含的子查詢中,並且要聚合的列是外部引用。”

但是我認為它將我想要實現的目標放在一起:

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

I.原始查詢的修改版本(@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

如果你想要一行,我建議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;

這是另一種方法:

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;

它看起來不太漂亮,但它可能會導致更好的執行計划(排序是一個非常耗費資源的條款)。

即使有多個具有相同出現的菜單項,它也應該返回結果。

我使用此查詢來查找出現次數最多的項目:

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 

包含聚合結果的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,賣得少。 這不是一個正確的答案。 我會與您的分析師或任何要求此結果的人討論此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM