2

非常に単純なテーブルを持つ:

CREATE TABLE users (
  name VARCHAR(50) NOT NULL,
  registered TIMESTAMP NOT NULL,
  CONSTRAINT users_pk PRIMARY KEY (name)
);

各月のユーザー登録数を選択する方法 例:

Jan 2010 - 19,
Feb 2010 - 0,
Mar 2010 - 7
4

3 に答える 3

3

これらのゼロエントリを取得するには、次のように参加する必要がありますgenerate_series:

select 
  to_char(gen_month, 'Mon YYYY'),
  count(name)
FROM generate_series(DATE '2010-01-01', DATE '2010-04-01', INTERVAL '1' MONTH) m(gen_month)
LEFT OUTER JOIN users 
ON (registered BETWEEN gen_month AND gen_month + INTERVAL '1' MONTH - INTERVAL '1' DAY)
GROUP BY gen_month;

を使用して少しきれいにするdate_truncことはできますが、通常の B ツリー インデックスを に使用することはできませんregistered

select 
  to_char(gen_month, 'Mon YYYY'),
  count(name)
FROM generate_series(DATE '2010-01-01', DATE '2010-04-01', INTERVAL '1' MONTH) m(gen_month)
LEFT OUTER JOIN users 
ON ( date_trunc('month', registered) = date_trunc('month', gen_month) )
GROUP BY gen_month;

書いたとおりに出力をきれいに印刷したい場合は、SELECT句を次のように置き換えることができます。

SELECT format('%s - %s', to_char(gen_month, 'Mon YYYY'), count(name))
于 2013-06-12T14:10:37.820 に答える
1
SELECT MONTH(registered),YEAR(registered),COUNT(name),
FROM users
GROUP BY YEAR(registered), MONTH(registered)
于 2013-06-12T06:16:09.193 に答える