簡體   English   中英

MYSQL在分組依據中使用限制

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

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