首页 > 解决方案 > 在日期范围内划分大查询 LIMIT

问题描述

我对 SQL 和大查询很陌生,所以这可能很简单。我正在对 BQ 中的公共数据集 GDELT 运行一些查询,并且对 LIMIT 有疑问。GDELT 非常庞大(14.4 TB),当我查询某些东西时,在这种情况下是一个人,我可以获得多达 100k 行或更多的结果,这在这种情况下太多了。但是当我使用 LIMIT 时,它似乎并没有真正将结果平均分配在日期上,导致我得到非常随机的时间线。限制是如何工作的,有没有办法根据天数更均匀地获得结果?

SELECT DATE,V2Tone,DocumentIdentifier as URL, Themes, Persons, Locations
FROM `gdelt-bq.gdeltv2.gkg_partitioned`
WHERE DATE>=20210610000000 and _PARTITIONTIME >= TIMESTAMP(@start_date)
AND DATE<=20210818999999 and _PARTITIONTIME <= TIMESTAMP(@end_date)
AND LOWER(DocumentIdentifier) like @url_topic
LIMIT @limit

运行此查询并执行一些 preproc 时,我得到以下时间序列: 在此处输入图像描述

它基于 15k 个结果,但它们在几天内分布非常不均匀/随机(因为如果我不使用限制,总共有超过 500k 个结果)。我想进行一个查询,将我的输出限制为 15k,但在几天内对数据进行一定程度的分区。

标签: sqlgoogle-bigquerysql-limitgdelt

解决方案


您需要排序,当您不对结果进行排序时,不能保证返回结果的顺序:

但如果您希望每天获得相同数量的行数,您可以使用窗口函数:

select * from (
SELECT
    DATE,
    V2Tone,
    DocumentIdentifier as URL,
    Themes,
    Persons,
    Locations,
    row_number() over (partition by DATE) rn
FROM `gdelt-bq.gdeltv2.gkg_partitioned`
WHERE
    DATE >= 20210610000000 AND DATE <= 20210818999999
    and _PARTITIONDATE >= @start_date and _PARTITIONDATE <= @end_date
    AND LOWER(DocumentIdentifier) like @url_topic
) t where rn = @numberofrowsperday 

如果您只传递日期,则可以使用 _PARTITIONDATE 过滤分区。


推荐阅读