在Postgres表中汇总重复数据

时间:2015-07-07 15:30:24

标签: postgresql

我有一个名为ngram_sightings的Postgres 9.1表。每行都是在文档中查看ngram的记录。 ngram可以在给定文档中多次出现。

 CREATE TABLE ngram_sightings
(
    ngram VARCHAR,
    doc_id INTEGER
);

我希望在另一个名为ngram_counts的表中汇总此表。

CREATE TABLE ngram_counts
(
    ngram VARCHAR PRIMARY INDEX,

    -- the number of unique doc_ids for a given ngram
    doc_count INTEGER,

    -- the count of a given ngram in ngram_sightings
    corpus_count INTEGER
);

这样做的最佳方式是什么?

ngram_sightings是大约10亿行。 我应该首先在ngram_sightings.ngram上创建索引吗?

1 个答案:

答案 0 :(得分:1)

给它一个机会!

INSERT INTO ngram_counts (ngram, doc_count, corpus_count)
SELECT
  ngram
, count(distinct doc_id) AS doc_count
, count(*) AS corpus_count 
FROM ngram_counts
GROUP BY ngram;

- 编辑 -

这是使用一些临时表的更长版本。首先,计算每个ngram与之关联的文档数量。我正在使用“tf”代表“术语频率”而“df”代表“doc频率”,因为你正朝着tf-idf vectorization的方向前进,你也可以使用标准语言,它将有助于接下来的几个步骤。

 CREATE TEMPORARY TABLE ngram_df AS
 SELECT
   ngram
 , count(distinct doc_id) AS df
 FROM ngram_counts
 GROUP BY ngram;

现在您可以为每个ngram的总计数创建表。

CREATE TEMPORARY TABLE ngram_tf AS
 SELECT
   ngram
 , count(*) AS tf
 FROM ngram_counts
 GROUP BY ngram;

然后在ngram上加入两个。

CREATE TABLE ngram_tfidf AS
SELECT
  tf.ngram
, tf.tf
, df.df
FROM ngram_tf
INNER JOIN ngram_df ON ngram_tf.ngram = ngram_df.ngram;

此时,我希望你会在ngram上查找ngram,所以在ngram上索引最后一个表是有意义的。让我发布!