【发布时间】:2019-06-14 17:01:03
【问题描述】:
我有一个如下表(例如here):
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')
我想根据每个 (name, date(pubdate)) 组合中的 statistic 值获取前两行。
换句话说,我想GROUP BY name, date(pubdate),但没有聚合函数,而是根据每个组的statistic 简单地获取前两行。 (所以,我知道它不是真正的GROUP BY,而是greatest-n-per-group。)
我正在使用带有标准 SQL 的 Google Big Query。我查看了其他一些solutions,但不确定在这种情况下如何实现结果。
想要的结果:
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
【问题讨论】:
-
您是否有一个带有主键的列,因为即使使用
ORDER BY statistic,结果仍然可能是非确定性(随机)因为统计列值不是唯一的 -
您的意思是,在
statistic的“关系”的情况下,不能保证结果是确定性的? @RaymondNijland -
“你的意思是,在统计数据的“关系”的情况下,结果不能保证是确定性的?“ 是的,这就是我的意思@BradSolomon 理想情况下你应该使用
ORDER BY some_column, <some_columns_with_primary_key>
标签: sql google-bigquery greatest-n-per-group