【发布时间】:2015-04-02 13:19:36
【问题描述】:
假设您有一个名为 tracker 的表,其中包含以下记录。
issue_id | ingest_date | verb,status
10 2015-01-24 00:00:00 1,1
10 2015-01-25 00:00:00 2,2
10 2015-01-26 00:00:00 2,3
10 2015-01-27 00:00:00 3,4
11 2015-01-10 00:00:00 1,3
11 2015-01-11 00:00:00 2,4
我需要以下结果
10 2015-01-26 00:00:00 2,3
11 2015-01-11 00:00:00 2,4
我正在尝试这个查询
select *
from etl_change_fact
where ingest_date = (select max(ingest_date)
from etl_change_fact);
但是,这只给了我
10 2015-01-26 00:00:00 2,3
这条记录。
但是,我希望所有唯一记录(change_id)都带有
(a) max(ingest_date) 与
(b) 动词列优先级为(2 - 第一个首选,1 - 第二个首选,3 - 最后一个首选)
因此,我需要以下结果
10 2015-01-26 00:00:00 2,3
11 2015-01-11 00:00:00 2,4
请帮我高效查询。
附注: 我不会索引 ingest_date,因为我将在分布式计算设置中将其设置为“分发密钥”。 我是数据仓库和查询的新手。
因此,请帮助我以优化方式访问我的 TB 大小的数据库。
【问题讨论】:
-
我不明白这个问题。 max(ingest_date) 是“2015-01-26 00:00:00”,所以条件 a) 只会让您获得该记录。你的条件(b)是什么意思?你能改写一下吗,因为我不明白你的描述与你想要返回的记录有什么关系。最后——mysql还是postgresql?
-
我需要postgreSQL
-
@mlinth :我的两个条件都有效......!请查看我的示例数据...相比之下,如果我取 max(ingest_date) 并且记录的动词为 3,我不想要该记录。我想要它之前的那个(我的意思是没有动词 3)
标签: postgresql query-optimization greatest-n-per-group postgresql-8.0