postgreSQL每月购买多少订阅

时间:2019-11-28 17:47:01

标签: sql postgresql

我有一张桌子:

Subscriptions (idsub, dstart, dend, #idk)

dstart是购买订阅的日期(数据类型:日期)

我需要计算今年(最好是-选择的年份)每个月购买了多少个订阅。 我知道应该用COUNT完成,但是我刚开始学习SQL,并且在“每个月”这一部分都在挣扎。

我正在使用Postgresql

感谢帮助

3 个答案:

答案 0 :(得分:2)

尝试一下

SELECT TO_CHAR(dstart, 'MM/YYYY') date, COUNT(*) total
FROM Subscriptions
WHERE EXTRACT(year from dstart) = 2019 
GROUP BY TO_CHAR(dstart, 'MM/YYYY')

答案 1 :(得分:1)

诀窍是应用GROUP BY,以便您的COUNT可以按月使用。您提到dstart是开始日期,因此我们将不得不从中获取月份。一种实现方法是使用date_trunc。 (date_trunc的文档可在此处阅读,以获取有关其工作原理的更多信息:https://www.postgresql.org/docs/9.1/functions-datetime.html)。

最后,您可以使用CURRENT_DATE获取当前年份,然后再次使用date_trunc仅获得今年的订阅。

总而言之,您的查询应如下所示:

SELECT
    DATE_TRUNC('MONTH', dstart),
    COUNT(idsub)
FROM Subscriptions
; to change the year, just change CURRENT_DATE 
; to a date with the year of your choice
WHERE DATE_TRUNC('YEAR', dstart)=DATE_TRUNC('YEAR', CURRENT_DATE)
GROUP BY DATE_TRUNC('MONTH', dstart)

还有其他方法可以执行此操作,但这应该可以解决您的基本问题,并且足以让您入门。例如,从此处,您还可以通过添加ORDER BY COUNT(idsub) DESC按订阅数进行排序。

答案 2 :(得分:1)

我强烈建议这样编写查询:

SELECT DATE_TRUNC('month', dstart) as yyyymm COUNT(*) total
FROM Subscriptions
WHERE dstart >= DATE_TRUNC('year', now()) AND
      dstart < DATE_TRUNC('year', now()) + INTERVAL '1 YEAR'
GROUP BY yyyymm
ORDER BY yyyymm;

此查询的重要组成部分是WHERE子句。尽管dstart看起来很复杂,但它不是函数的参数。这有助于优化程序,并允许优化程序使用列上的索引(如果有的话)。