0

我有一个包含 200000 行和列的表:名称和日期。日期和名称可能具有重复值。我想获得按升序排序的日期的前 300 个唯一名称,并让它运行得很快,因为我的表可能有一百万行。

我正在使用 postgresql 9。

4

2 回答 2

1
SELECT name, date
FROM
  (
    SELECT DISTINCT ON (name) name, date
    FROM table
    ORDER BY name, date
  ) AS id_date
ORDER BY date
LIMIT 300;

@jachguate 的最后一个查询将错过在同一日期有两个日期的名称,但是这个没有。

在具有大约 100.000 个条目的非优化 postgresql 9.1 中,查询大约需要 100 毫秒,因此它可能无法扩展到数百万个条目。

升级到 postgresql 9.2 可能会有所帮助,因为根据发行说明有许多性能改进

于 2012-11-23T17:26:21.840 回答
0

使用 CTE:

with unique_date_name as (
       select date, name, count(*) rcount
         from table
        group by date, name
       having count(*) = 1
     )
select name, date
  from unique_date_name
 order by date limit 300;

编辑 从评论中,这会导致性能不佳,所以试试这个:

       select date, name, count(*) rcount
         from table
        group by date, name
       having count(*) = 1
        order by date limit 300;

或者,将原始查询转换为 FROM 中的嵌套子查询,而不是 CTE:

select name, date
from (
       select date, name, count(*) rcount
         from table
        group by date, name
       having count(*) = 1
     ) unique_date_name
 order by date limit 300;

不幸的是,我手头没有 postgreSQL 来检查它是否有效,但优化器会做得更好。

(日期,名称)的索引是获得最佳性能的必要条件。

于 2012-11-22T17:56:35.257 回答