如果表格中的日期、專案和類別相同,我想將其視為同一行并從中回傳 n 行(例如:如果 n 為 3,則限制為 0、3)。
------------------------------------------
id | date | item | category | ...
------------------------------------------
101 | 20220201| pencil | stationery | ... <---
------------------------------------------ | treat as same result
105 | 20220201| pencil | stationery | ... <---
------------------------------------------
120 | 20220214| desk | furniture | ...
------------------------------------------
125 | 20220219| tongs | utensil | ... <---
------------------------------------------ | treat as same
129 | 20220219| tongs | utensil | ... <---
------------------------------------------
130 | 20220222| tongs | utensil | ...
預期結果(如果 n 為 3)
-----------------------------------------------
id | date | item | category | ... rank
-----------------------------------------------
101 | 20220201| pencil | stationery | ... 1
-----------------------------------------------
105 | 20220201| pencil | stationery | ... 1
-----------------------------------------------
120 | 20220214| desk | furniture | ... 2
-----------------------------------------------
125 | 20220219| tongs | utensil | ... 3
-----------------------------------------------
129 | 20220219| tongs | utensil | ... 3
問題是我還必須帶上每個組的價值觀。如果我只有一列可以分組,我可以將 id 值與原始表進行比較,但我不知道如何處理多列。
有沒有辦法解決這個問題?
作為參考,我使用了一個用戶變數來將它與以前的值進行比較,我不能使用它,因為持續時間很慢。
SELECT
*,
IF(@prev_date=date and @prev_item=item and @prev_category=category,@ranking, @ranking:=@ranking 1) AS sameRow,
@prev_item:=item,
@prev_date:= date,
@prev_category:=category,
@ranking
FROM ( SELECT ...
我使用的是 Mysql 8.0 版本,id 值不是連續數字,因為我必須在 group by 之前 order by。
uj5u.com熱心網友回復:
如果我理解正確,您可以嘗試使用dense_rank視窗功能并設定order by您的預期列
如果date列可以代表訂單號,我會把它放在第一位。
SELECT *
FROM (
SELECT *,dense_rank() OVER(ORDER BY date, item, category) rnk
FROM T
) t1
SQLFIDDLE
uj5u.com熱心網友回復:
在這種情況下,視窗函式就派上用場了。但是對于我們這些仍在使用 MySQL 5.7 的人,其中不存在 row_number 等函式,我們不得不求助于使用用戶變數并在主陳述句之前每次重置值,或者直接在陳述句中定義用戶變數.
方法一
set @row_id=0; -- remember to reset the row_id to 0 every time before the main query below
select id,date,item,category,rank from testtb join
(
select date,item,category, (@row_id:=@row_id 1) as rank
from
(select date,item,category from testtb group by date,item,category) t1
) t2
using(date,item,category);
方法二
select id,date,item,category,rank from testtb join
(
select date,item,category, (@row_id:=@row_id 1) as rank
from
(select date,item,category from testtb group by date,item,category) t1, (select @row_id := 0) as n
) t2
using(date,item,category);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464325.html
