Bra*_*mon 2 sql greatest-n-per-group google-bigquery
我有一个如下表(此处为示例):
CREATE TABLE topics (
name varchar(64),
url varchar(253),
statistic integer,
pubdate timestamp
);
INSERT INTO topics VALUES
('a', 'b', 100, TIMESTAMP '2011-05-16 15:36:38'),
('a', 'c', 110, TIMESTAMP '2014-04-01 00:00:00'),
('a', 'd', 120, TIMESTAMP '2014-04-01 00:00:00'),
('a', 'e', 90, TIMESTAMP '2011-05-16 15:36:38'),
('a', 'f', 80, TIMESTAMP '2014-04-01 00:00:00'),
('a', 'g', 70, TIMESTAMP '2011-05-16 15:36:38'),
('a', 'h', 150, TIMESTAMP '2014-04-01 00:00:00'),
('a', 'i', 50, TIMESTAMP '2011-05-16 15:36:38'),
('b', 'j', 10, TIMESTAMP '2014-04-01 00:00:00'),
('b', 'k', 11, TIMESTAMP '2011-05-16 15:36:38'),
('b', 'l', 12, TIMESTAMP '2014-04-01 00:00:00'),
('b', 'm', 9, TIMESTAMP '2011-05-16 15:36:38'),
('b', 'n', 8, TIMESTAMP '2014-04-01 00:00:00'),
('b', 'o', 7, TIMESTAMP '2011-05-16 15:36:38'),
('b', 'p', 15, TIMESTAMP '2014-04-01 00:00:00'),
('b', 'q', 5, TIMESTAMP '2011-05-16 15:36:38'),
('b', 'r', 2, TIMESTAMP '2014-04-01 00:00:00')
Run Code Online (Sandbox Code Playgroud)
我想根据statistic
每个 ( name, date(pubdate)
) 组合的值获取前两行。
换句话说,我想GROUP BY name, date(pubdate)
,但没有聚合函数,而是简单地根据每个组中的前两行获取结果statistic
。(所以,我知道它不是真正的GROUP BY
,而是greatest-n-per-group
。)
我正在使用带有标准 SQL 的 Google Big Query。我已经研究了许多其他解决方案,但不确定如何在这种情况下实现结果。
期望的结果:
name url statistic date
a b 100 2011-05-16
a e 90 2011-05-16
a h 150 2014-04-01
a d 120 2014-04-01
b m 9 2011-05-16
b k 11 2011-05-16
b l 12 2014-04-01
b p 15 2014-04-01
Run Code Online (Sandbox Code Playgroud)
以下是 BigQuery 标准 SQL
#standardSQL
SELECT * EXCEPT(arr) FROM (
SELECT name, DATE(pubdate) day,
ARRAY_AGG(STRUCT(url, statistic) ORDER BY statistic DESC LIMIT 2) arr
FROM `project.dataset.table`
GROUP BY name, day
), UNNEST(arr)
-- ORDER BY name, day
Run Code Online (Sandbox Code Playgroud)
您可以使用问题中的示例数据来测试、玩上面的内容,如下例所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'a' name, 'b' url, 100 statistic, TIMESTAMP '2011-05-16 15:36:38' pubdate UNION ALL
SELECT 'a', 'c', 110, '2014-04-01 00:00:00' UNION ALL
SELECT 'a', 'd', 120, '2014-04-01 00:00:00' UNION ALL
SELECT 'a', 'e', 90, '2011-05-16 15:36:38' UNION ALL
SELECT 'a', 'f', 80, '2014-04-01 00:00:00' UNION ALL
SELECT 'a', 'g', 70, '2011-05-16 15:36:38' UNION ALL
SELECT 'a', 'h', 150, '2014-04-01 00:00:00' UNION ALL
SELECT 'a', 'i', 50, '2011-05-16 15:36:38' UNION ALL
SELECT 'b', 'j', 10, '2014-04-01 00:00:00' UNION ALL
SELECT 'b', 'k', 11, '2011-05-16 15:36:38' UNION ALL
SELECT 'b', 'l', 12, '2014-04-01 00:00:00' UNION ALL
SELECT 'b', 'm', 9, '2011-05-16 15:36:38' UNION ALL
SELECT 'b', 'n', 8, '2014-04-01 00:00:00' UNION ALL
SELECT 'b', 'o', 7, '2011-05-16 15:36:38' UNION ALL
SELECT 'b', 'p', 15, '2014-04-01 00:00:00' UNION ALL
SELECT 'b', 'q', 5, '2011-05-16 15:36:38' UNION ALL
SELECT 'b', 'r', 2, '2014-04-01 00:00:00'
)
SELECT * EXCEPT(arr) FROM (
SELECT name, DATE(pubdate) day,
ARRAY_AGG(STRUCT(url, statistic) ORDER BY statistic DESC LIMIT 2) arr
FROM `project.dataset.table`
GROUP BY name, day
), UNNEST(arr)
ORDER BY name, day
Run Code Online (Sandbox Code Playgroud)
有结果
Row name day url statistic
1 a 2011-05-16 b 100
2 a 2011-05-16 e 90
3 a 2014-04-01 h 150
4 a 2014-04-01 d 120
5 b 2011-05-16 k 11
6 b 2011-05-16 m 9
7 b 2014-04-01 p 15
8 b 2014-04-01 l 12
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3211 次 |
最近记录: |