SQL 时间序列数据的前 N 个序列
SQL top N series for time-series data
我正在尝试构建一个 sql 查询,它将为我提供前 N 个系列。为简化起见,我们可以说前 N 意味着第一天的最大计数()(或者整个系列的计数()会更好)。
例如:
我有 X 列,但我要聚合的只有两列:"color" 和 "date"。 "color" 列有多个 100 个变体,但我只想要前 10 个。对于 10 个 "colors" 中的每一个,我想要所有日期的计数 (*)
没有排名,我的查询将如下所示:
"select count(*), color, date from table group by color, date"
如果我放一个 "order by + limit" 它只会 select 顶部片段,而不是顶部系列。
有什么想法吗?
谢谢
PS;如果这改变了我正在使用的任何东西 hive/impala
EX 输入:
color | date
red | 2016-01-01
red | 2016-01-01
red | 2016-01-01
red | 2016-01-01
black | 2016-01-01
black | 2016-01-01
black | 2016-01-01
red | 2016-01-02
red | 2016-01-02
black | 2016-01-02
black | 2016-01-02
black | 2016-01-02
blue | 2016-01-03
blue | 2016-01-03
blue | 2016-01-03
blue | 2016-01-03
black | 2016-01-03
red | 2016-01-03
在这种情况下,如果我 select 只有 "top 2 series",即使第三天蓝色是最大的,我只想 select 黑色和红色,因为它们是最大的"overall"。蓝色应该被完全过滤掉结果
期望的输出
color | date | count
red | 2016-01-01 | 4
black | 2016-01-01 | 3
red | 2016-01-02 | 2
black | 2016-01-02 | 3
red | 2016-01-03 | 1
black | 2016-01-03 | 1
这可以使用 cte 和 window function 来实现。
with temp as (
SELECT color ,date, COUNT(1) OVER (PARTITION BY color ,date ) as cont
from table)
select * from temp order by cont
注意: 将 table 更新为 table 名称。
我正在尝试构建一个 sql 查询,它将为我提供前 N 个系列。为简化起见,我们可以说前 N 意味着第一天的最大计数()(或者整个系列的计数()会更好)。
例如: 我有 X 列,但我要聚合的只有两列:"color" 和 "date"。 "color" 列有多个 100 个变体,但我只想要前 10 个。对于 10 个 "colors" 中的每一个,我想要所有日期的计数 (*)
没有排名,我的查询将如下所示:
"select count(*), color, date from table group by color, date"
如果我放一个 "order by + limit" 它只会 select 顶部片段,而不是顶部系列。
有什么想法吗?
谢谢
PS;如果这改变了我正在使用的任何东西 hive/impala
EX 输入:
color | date
red | 2016-01-01
red | 2016-01-01
red | 2016-01-01
red | 2016-01-01
black | 2016-01-01
black | 2016-01-01
black | 2016-01-01
red | 2016-01-02
red | 2016-01-02
black | 2016-01-02
black | 2016-01-02
black | 2016-01-02
blue | 2016-01-03
blue | 2016-01-03
blue | 2016-01-03
blue | 2016-01-03
black | 2016-01-03
red | 2016-01-03
在这种情况下,如果我 select 只有 "top 2 series",即使第三天蓝色是最大的,我只想 select 黑色和红色,因为它们是最大的"overall"。蓝色应该被完全过滤掉结果
期望的输出
color | date | count
red | 2016-01-01 | 4
black | 2016-01-01 | 3
red | 2016-01-02 | 2
black | 2016-01-02 | 3
red | 2016-01-03 | 1
black | 2016-01-03 | 1
这可以使用 cte 和 window function 来实现。
with temp as (
SELECT color ,date, COUNT(1) OVER (PARTITION BY color ,date ) as cont
from table)
select * from temp order by cont
注意: 将 table 更新为 table 名称。