假設你想每個類別的「頂」的產品,你就需要組類別和使用聚合(在這種情況下最大)。
請注意,即使mysql允許將「未聚合」列與聚合類似,但結果可能不是唯一的(例如,由於在productName
上缺少聚合/分組,因此MSSQL不允許這樣的查詢) :
SELECT
productName, -- unaggregated -> undetermined.
productCategoryID, -- grouping-condition -> fine
MAX((maxprice/minprice-1)*100) as PercentChange -- Aggregation -> fine
FROM products WHERE updatedDate > DATE_ADD(NOW(), INTERVAL -1 DAY)
AND productCategoryID NOT IN (0,58,12,13)
AND (maxprice/minprice-1)*100) < '60'
GROUP BY productCategoryID
ORDER BY PercentChange DESC LIMIT 10
鑑於數據(簡化的)
productName | productCategoryID | PercentChange
A 1 50
B 1 10
C 2 40
D 2 40
僅productCategoryID
和PercentChange
是可靠的。
結果可能是
A | 1 | 50
C | 2 | 40
,但由於對productName
缺少的聚合以下結果也可能是可行的:
A | 1 | 50
D | 2 | 40
將producte每個類別的一個條目,但如果兩個行與其「分組」相同,但最終的結果不是100%可預測的,因此應該採取另一種方法。
你可以 - 例如 - 按名稱組爲好,然後以編程方式過濾掉不想要的結果:
SELECT
productName, -- grouping-condition -> fine
productCategoryID, -- grouping-condition -> fine
MAX((maxprice/minprice-1)*100) as PercentChange -- Aggregation -> fine
FROM products WHERE updatedDate > DATE_ADD(NOW(), INTERVAL -1 DAY)
AND productCategoryID NOT IN (0,58,12,13)
AND (maxprice/minprice-1)*100) < '60'
GROUP BY productName, productCategoryID
ORDER BY PercentChange DESC LIMIT 10
會導致
A | 1 | 50
C | 2 | 40
D | 2 | 40
相比於「非分組」查詢這至少會消除不匹配MAX(PercentChange)
(按名稱和類別)的每個條目。
PS:如果你想在最低價格的變化,使用MIN()
明顯。的
可能的複製[選擇每個GROUP BY組第一排?](HTTP://計算器。com/questions/3800551/select-first-in-each-group-by-group) – Johan