【问题标题】:Using () OVER or HAVING clause to get monthly aggregates of counts使用 () OVER 或 HAVING 子句获取每月计数汇总
【发布时间】:2021-04-08 13:19:27
【问题描述】:

我有一个关于一年中门票销售的大型数据集。我正在使用的架构是:

ID
date_time_sale (Timestamp, yyyy-MM-dd hh-mm-ss)
weekday (varchar, Mon to Sun)
number_tickets (integer)   
ticket_price (float)
total_price (float)

我正在尝试获取一年中售出票数最多的每个月的工作日,因此,例如,输出将是:

year month weekday total_tickets
2015 01 SAT 5400
2015 02 SUN 4300
2015 03 SUN 6400

我尝试使用以下方法,但不可否认 SQL 不是我最擅长的技能:

SELECT DISTINCT EXTRACT(YEAR FROM date_time_sale) AS YEAR,
      EXTRACT(MONTH FROM date_time_sale) AS MONTH,
      week_day,
      RANK () OVER (PARTITION BY YEAR, MOMTH ORDER BY count(week_day) ASC) weekday_count
      from ticket_sales
      order by YEAR, MONTH

但我总是遇到错误。我尝试使用 HAVING 子句,但我哪儿也去不了。关于如何有效地使用 RANK () OVER (PARTITION BY) 子句来获得此输出的任何提示,好吗?还是我需要使用 COUNT () OVER?

分析异常说:

`cannot resolve '`YEAR`' given input columns: [ticket_sales.YEAR, ticket_sales.MONTH, weekday]; line 1 pos 292;\n'Sort ['YEAR ASC NULLS FIRST, 'MONTH ASC NULLS FIRST], true\n+- Project [YEAR#342, MONTH#358 

但这是一个相当长的错误。

更新:

所以我尝试了这段代码:

SELECT DISTINCT year,
          month,
          week_day,
          COUNT (week_day) OVER (PARTITION BY year, month, week_day) AS weekday_count 
          from ticket_sales
           order by year, month, weekday_count DESC

这样做是给出每个月的所有工作日的结果,所以输出是 12*7 而不是 12 行。仍然可以学习解决这个问题,但至少我在某个地方。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 数据库是我的讲师对外提供的。
  • edit您的任务并添加您遇到的错误

标签: sql group-by aggregate-functions having-clause


【解决方案1】:

试试这个查询,如果返回期望结果,请告诉我:

我不确定字段名称是 number_tickets 还是 total_tickets,我使用了 number_tickets。

首先我将年份、月份和工作日的票数相加,然后返回每年和每月的一行以及售出更多票的星期几。

WITH total_by_day AS (SELECT EXTRACT(YEAR FROM date_time_sale) AS YEAR,
      EXTRACT(MONTH FROM date_time_sale) AS MONTH,
      week_day,
      SUM(number_tickets) AS number_tickets
FROM ticket_sales
GROUP BY YEAR, MONTH, week_day)

SELECT DISTINCT 
      YEAR,
      MONTH,
      FIRST_VALUE(week_day) OVER (PARTITION BY YEAR, MONTH ORDER BY number_tickets DESC) AS week_day,
      FIRST_VALUE(number_tickets) OVER (PARTITION BY YEAR, MONTH ORDER BY number_tickets DESC) AS total_tickets
FROM total_by_day
ORDER BY YEAR, MONTH;

在 Postgresql 数据库中,我得到了想要的结果。

【讨论】:

  • 所以,这没有用,但我找到了某个地方。
  • 我最近改了。再次检查。现在我先将所有售出的门票按年、月和星期天汇总。
  • 所以,我首先将日期和时间分成不同的列,然后我的代码如下:
      SELECT DISTINCT YEAR, MONTH, <pre>  week_day, <pre>  COUNT (week_day) OVER (PARTITION BYEAR, MONTH, week_day) <pre>  AS weekday_count <pre>  from ticket_sales <pre>  order by YEAR, MONTH 给我的是所有表格,但显示了所有天的总销售额,而不仅仅是最大值,因此,对于一月份,它显示了所有星期六、星期日等的销售额。不过,我仍然需要获得最大值。
  • 再次检查我的查询,它应该返回一个像您想要的输出一样的表格。
  • 抱歉,我认为代码可以在 cmets 中显示。我在那里发布了更新。我会试试你的查询。
猜你喜欢
  • 2017-07-14
  • 2019-02-04
  • 1970-01-01
  • 2011-08-21
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
相关资源
最近更新 更多