[英]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.