繁体   English   中英

如何执行最大限制号。 SQL 中每个日期每天的行数?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM