如何返回按月和年排序的选择

时间:2014-11-28 20:19:12

标签: sql postgresql group-by sql-order-by extract

我正在尝试运行查询以选择和计算按其邮政编码,月份和年份分组的行,但我遇到了结果排序方面的问题。我能做的最好的事情是按年份排序结果,但月份按字母顺序排列。

这是我的查询

SELECT incident_zip, 
   TO_CHAR(created_date,'Mon') AS mon,
   EXTRACT(year FROM created_date) AS yyyy,
   COUNT(*) AS total 
FROM complaints 
WHERE incident_zip 
IN (11209, 11201, 11202, 11203, 11204,
  11205, 11206, 11207, 11208, 11209, 
  11210, 11211, 11212, 11213, 11214, 
  11215, 11216, 11217, 11218, 11219, 
  11220, 11221, 11222, 11223, 11224, 
  11225, 11226, 11228, 11229, 11230, 
  11231, 11232, 11233, 11234, 11235, 
  11236, 11237, 11238, 11239, 11240, 
  11241, 11242, 11243, 11244, 11245, 
  11247, 11248, 11249, 11251, 11252, 
  11254, 11255, 11256) 
GROUP BY 1, 2, 3
ORDER BY 1, 3 ASC;

我的结果如下,

 incident_zip | mon | yyyy | total 
--------------+-----+------+-------
        11201 | Apr | 2010 |    23
        11201 | Aug | 2010 |     2
        11201 | Dec | 2010 |    96

有没有办法提取月份和年份,或者我是以错误的方式解决这个问题?

3 个答案:

答案 0 :(得分:1)

我使用了DATE_TRUNC('month', created_date) AS Date,它返回了一种"舍入"日期时间对象。它看起来像这样2010-01-01 00:00:00-05。由于datetime对象仍然包含我可以使用少一组的年份来订购结果。

答案 1 :(得分:0)

您可以通过MM代表月份订购:

... 
GROUP BY 1, 2, 3, to_char(created_date,'MM')
ORDER BY 1, to_char(created_date,'MM') ASC;

答案 2 :(得分:0)

从每个组中选择任何日期并将其用于排序。例如,您可以按MAX(created_date)排序:

ORDER BY 1, MAX(created_date)