在PostgreSQL中按年份分组

时间:2019-01-24 14:43:58

标签: sql postgresql

 customer      Date      location

     1         25Jan2018     texas

     2         15Jan2018     texas

     3         12Feb2018     Boston

     4         19Mar2017     Boston.

我正在尝试按Date列的yearmon找出客户组的计数。Date列为文本数据类型

例如:在2018年1月,计数为2

4 个答案:

答案 0 :(得分:1)

您不应将日期存储在文本列中...

select substring(Date, length(Date)-6), count(*)
from tablename
group by substring(Date, length(Date)-6)

答案 1 :(得分:1)

我会做以下事情:

SELECT
  date_part('year', formattedDate) as Year
 ,date_part('month', formattedDate) as Month
 ,count(*) as CustomerCountByYearMonth
FROM
 (SELECT to_date(Date,'DDMonYYYY') as formattedDate from <table>) as tbl1
GROUP BY
  date_part('year', formattedDate)
 ,date_part('month', formattedDate)

内部查询可以对日期进行任何其他格式设置,以进行调整,以防万一需要填充某些位数的天,或者一个月中有四个字母而不是三个字母的情况。

通过转换为日期类型,您可以按日期类型(而不是字母顺序)正确排序。

可选:

SELECT
  Year
 ,Month
 ,count(*) as CustomerCountByYearMonth
FROM
 (SELECT
   date_part('year', to_date(Date,'DDMonYYYY')) as Year
  ,date_part('month', to_date(Date,'DDMonYYYY')) as Month
 FROM <table>) as tbl1
GROUP BY
  Year
 ,Month

答案 2 :(得分:0)

我以为@Jarlh问了一个好问题-1月1日这样的日期呢?是2019年1月1日还是2019年1月1日?如果可以,则正则表达式可能会起作用。

select
  substring (date from '\d+(\D{3}\d{4})') as month,
  count (distinct customer)
from t
group by month

“与众不同的客户”还假设您可能在同一个月内列出了同一位客户,但您只想计算一次。如果不是这种情况,只需删除“ distinct”即可。

而且,如果您希望以日期格式输出:

select
  to_date (substring (date from '\d+(\D{3}\d{4})'), 'monyyyy') as month,
  count (distinct customer)
from t
group by month

答案 3 :(得分:-1)

如果它是日期列,则可以截断日期:

select date_trunc('month', date) as yyyymm, count(*)
from t
group by yyyymm
order by yyyymm;

我真的读到类型是date。对于字符串,只需使用字符串函数:

select substr(date, 3, 7) as mmmyyyy, count(*)
from t
group by mmmyyyy;

不幸的是,在这种情况下无法订购。您确实应该使用正确的类型来存储日期。