[英]MYSQL Using Limit In Group By
我有這種查詢,需要在每個“區域”組中限制3個,但它沒有按我的預期運行。 “ row_number”似乎沒有相應安排。 一定有一些語法我錯過了,或者我不知道。 如果有人可以幫助我在這里轉儲sql。 MYSQL 5.0版
我的查詢:
set @type = '';
set @num = 0;
SELECT locinvaisle.Area as ar,locinvaisle.Region as rg,custlist.CustomerName as cn,custlist.Custtype ct,
SUM(data2.quantity/1000) as mtcur,
@num := if(@type = locinvaisle.Region, @num + 1, 1) as dummy_1,
@type := locinvaisle.Region as dummy_2,
@num as row_number
FROM data2
INNER JOIN custlist ON data2.customeracc = custlist.Customeraccount
INNER JOIN locinvaisle ON data2.location = locinvaisle.Location
WHERE
date1 >= DATE_FORMAT('2018-06-11', '%Y-01-01') AND date1 <= DATE_FORMAT('2018-06-11', '%Y-%m-31')
AND
data2.unit = 'KG'
AND
data2.customeracc not in (select Customeraccount from custlist WHERE Custcat = 'bcsb')
AND
locinvaisle.Area = 'peninsular'
AND
custlist.Custtype = 'others'
GROUP BY locinvaisle.Region,custlist.CustomerName
HAVING row_number < 3
ORDER BY locinvaisle.Region,mtcur desc
結果:
所需結果(來自虛擬數據庫):
在應用group by之前,您必須將限制作為完整的子查詢(“派生表”)進行。 遵循以下原則:
SELECT
ar, rg, cn, ct, sum(quantity)
FROM (
SELECT
@row_num :=IF(@prev_value = locinvaisle.Region, @row_num + 1, 1)AS RowNumber
, locinvaisle.Area as ar
, locinvaisle.Region as rg
, custlist.CustomerName as cn
, custlist.Custtype ct
, data2.quantity
, @prev_value := locinvaisle.Region as dummy_2,
FROM data2
INNER JOIN custlist ON data2.customeracc = custlist.Customeraccount
INNER JOIN locinvaisle ON data2.location = locinvaisle.Location
CROSS JOIN (SELECT @row_num :=1, @prev_value :='') vars
WHERE date1 >= DATE_FORMAT('2018-06-11', '%Y-01-01') AND date1 <= DATE_FORMAT('2018-06-11', '%Y-%m-31')
AND data2.unit = 'KG'
AND data2.customeracc not in (select Customeraccount from custlist WHERE Custcat = 'bcsb')
AND locinvaisle.Area = 'peninsular'
AND custlist.Custtype = 'others'
ORDER BY locinvaisle.Region,mtcur desc
) d
WHERE rowNumber <= 3
GROUP BY ar, rg, cn, ct
ORDER BY ar, rg, cn, ct
注意:您需要在子查詢中應用ORDER BY
來方便行號的計算,但是盡管如此,除非您應用final order by子句,否則不能保證最終輸出將按期望的順序進行。
另外請注意,在將來的MySQL版本(V8及更高版本)中,應該使用row_number()
函數和over()
子句來代替上面看到的變量。
在MySQL中,使用變量時需要小心。 有兩點很重要:
因此,嘗試這樣的事情:
SELECT x.*,
(@rn := IF(@r = la.Region, @num + 1,
IF(@r := la.Region, 1, 1)
)
) as rn
FROM (SELECT la.Area as ar, la.Region as rg, c.CustomerName as cn, c.Custtype ct,
SUM(data2.quantity/1000) as mtcur
FROM data2 d INNER JOIN
custlist c
ON d.customeracc = c.Customeraccount INNER JOIN
locinvaisle la
ON d.location = la.Location
WHERE date1 >= DATE_FORMAT('2018-06-11', '%Y-01-01') AND
date1 <= DATE_FORMAT('2018-06-11', '%Y-%m-31') AND
d.unit = 'KG' AND
d.customeracc not in (select Customeraccount from custlist cl WHERE cl Custcat = 'bcsb') AND
la.Area = 'peninsular' AND
c.Custtype = 'others'
GROUP BY la.Region, c.CustomerName
) x CROSS JOIN
(SELECT @r := 0, @rn := 0) params
HAVING rn <= 3;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.