我的Vertica数据库包含许多带日期(时间戳)的记录和更多属性。例如,'testTable'看起来像
a varchar(255)
b int
timestamp bigint
我需要在一段时间内(例如1月1日到1月15日)找到每天sum(b)
的前10名,其中这些日期可以由用户指定。
迭代查询将如何?粗俗的方式可以是单独的SELECT
语句,其中包含UNION ALL
。
select a, sum(b) from testTable where TO_TIMESTAMP( timestamp ) between '2012-01-01 05:10:00' and '2012-01-02 05:10:00' group by a order by sum(b) desc LIMIT 10
UNION ALL
select a, sum(b) from testTable where TO_TIMESTAMP( timestamp ) between '2012-01-02 05:10:00' and '2012-01-03 05:10:00' group by a order by sum(b) desc LIMIT 10
UNION ALL
select a, sum(b) from testTable where TO_TIMESTAMP( timestamp ) between '2012-01-03 05:10:00' and '2012-01-04 05:10:00' group by a order by sum(b) desc LIMIT 10
..
..
..
UNION ALL
select a, sum(b) from testTable where TO_TIMESTAMP( timestamp ) between '2012-01-14 05:10:00' and '2012-01-15 05:10:00' group by a order by sum(b) desc LIMIT 10 ;
但我希望它更通用,用户可以运行具有两个给定日期的脚本。
答案 0 :(得分:0)
语法可能有些偏差...我没有Vertica来测试。
select day, a, tot
from
(
select
*,
ROW_NUMBER() OVER (PARTITION BY tt4.day) as row_number
from
(
select
ts as day,
tt1.a,
sum(tt1.b) as tot
from
testTable tt1,
( select distinct date(TO_TIMESTAMP(tt2.timestamp)) as ts
from testTable tt2
where date(TO_TIMESTAMP(tt2.timestamp)) between cast('2012/01/01' as date) and cast('2012/01/15' as date) ) as tt3
where
date(TO_TIMESTAMP(tt1.timestamp)) = tt3.ts
group by
date(TO_TIMESTAMP(tt1.timestamp)),
tt1.a
order by
date(TO_TIMESTAMP(tt1.timestamp)),
sum(tt1.b) desc,
tt1.a
) as tt4
) as tt5
where
tt5.row_number <=10