[英]How to enforce a max limit no. of rows per day per date in SQL?
给定如下所示的数据,其中日期采用字符串格式YYYYMMDD
:
物品 | 越南语 | 成本 | 唯一身份 | 销售日期 |
---|---|---|---|---|
水果 | 小岛 | 10 | abc123 | 20211001 |
水果 | 小岛 | 8个 | 富99 | 20211001 |
水果 | 小岛 | 9 | 富99 | 20211001 |
蔬菜 | 劳 | 3个 | rr1239 | 20211001 |
蔬菜 | 劳 | 3个 | rr1239 | 20211001 |
水果 | 小岛 | 12 | abc123 | 20211002 |
水果 | 小岛 | 14 | abc123 | 20211002 |
水果 | 小岛 | 8个 | abc123 | 20211002 |
水果 | 小岛 | 5个 | 富99 | 20211002 |
蔬菜 | 劳 | 8个 | rr1239 | 20211002 |
蔬菜 | 劳 | 1个 | rr1239 | 20211002 |
蔬菜 | 劳 | 12 | ud9213 | 20211002 |
蔬菜 | 劳 | 19 | r11759 | 20211002 |
水果 | 小岛 | 6个 | 富99 | 20211003 |
水果 | 小岛 | 2个 | abc123 | 20211003 |
水果 | 小岛 | 12 | abc123 | 20211003 |
蔬菜 | 劳 | 1个 | ud97863 | 20211003 |
蔬菜 | 劳 | 9 | r112359 | 20211003 |
水果 | 小岛 | 6个 | 富99 | 20211004 |
水果 | 小岛 | 2个 | abc123 | 20211004 |
水果 | 小岛 | 12 | abc123 | 20211004 |
蔬菜 | 劳 | 9 | r112359 | 20211004 |
目标是在特定时间范围内对所有行进行采样,例如 2020-10-02 到 2020-10-03 并每天最多提取 3 行,例如使用此查询:
SELECT * FROM mytable
WHERE sales_date BETWEEN '20211002' AND '20211003'
ORDER BY RAND () LIMIT 6
上表的预期 output 是:
物品 | 越南语 | 成本 | 唯一身份 | 销售日期 |
---|---|---|---|---|
水果 | 小岛 | 8个 | abc123 | 20211002 |
水果 | 小岛 | 5个 | 富99 | 20211002 |
蔬菜 | 劳 | 8个 | rr1239 | 20211002 |
水果 | 小岛 | 12 | abc123 | 20211003 |
蔬菜 | 劳 | 1个 | ud97863 | 20211003 |
蔬菜 | 劳 | 9 | r112359 | 20211003 |
但是有可能所有 6 行预期都来自一天:
物品 | 越南语 | 成本 | 唯一身份 | 销售日期 |
---|---|---|---|---|
水果 | 小岛 | 12 | abc123 | 20211002 |
水果 | 小岛 | 14 | abc123 | 20211002 |
水果 | 小岛 | 8个 | abc123 | 20211002 |
水果 | 小岛 | 5个 | 富99 | 20211002 |
蔬菜 | 劳 | 8个 | rr1239 | 20211002 |
蔬菜 | 劳 | 1个 | rr1239 | 20211002 |
所以为了确保我每天最多 3 行,我每天运行多个查询,即
SELECT * FROM mytable
WHERE sales_date='20211002'
ORDER BY RAND () LIMIT 3
和
SELECT * FROM mytable
WHERE sales_date='20211003'
ORDER BY RAND () LIMIT 3
有没有办法确保 N 没有。 单个查询中每天的最大限制行数?
否则有没有办法将每天的一个查询组合成一个“超级查询”? 如果我们谈论一整年,它将有 365 个查询,每天一个。
由于 2 天内 6 行意味着每天恰好 3 行,让我们将其扩展为一周。
在子查询中,使用row_number
为每个日期的每一行分配一个数字。 然后只有 select 行号为 3 或更少的那些。
select *
from (
select
*,
row_number() over (partition by sales_date order by rand()) as row
from mytable
where sales_date between '20211002' and '20211009'
)
where row <= 3
order by rand()
limit 6
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.