【问题标题】:Find most visited Hotel by month in PostgreSQL在 PostgreSQL 中按月查找访问量最大的酒店
【发布时间】:2022-01-20 02:12:13
【问题描述】:

我有一张桌子,有几个客户在酒店住了一个月或几个月。我需要按月找到 3 家访问量最大的酒店。如果一位客户在酒店住了三个月,那么它指的是三个月。更准确地说,下表hotel 我有:

id usr_id srch_ci srch_co hotel_id
1 13 2021-10-01 2021-11-22 200
2 12 2021-10-11 2021-10-22 300
3 11 2021-10-28 2021-11-05 200
4 10 2021-10-28 2021-12-03 100

结果应如下所示:


mnth hotel_id rnk visits
2021-10 200 1 2
2021-10 100 2 1
2021-10 300 2 1
2021-11 200 1 2
2021-11 100 2 1
2021-12 100 1 1

如上所示,user_id = 10hotel = 100 住了 3 个不同的月份。这意味着它在 3 个不同的月份为一家酒店计为 1 个计数。而对于2021-12 月只有用户 = 10 人入住,因此在 2021-12 月酒店 = 100 被列为1st

【问题讨论】:

  • 您对解决方案的编码尝试在哪里?如果没有,请research 寻求解决方案,认真尝试,然后返回一个关于尝试的具体问题,例如任何错误或不希望的结果。
  • 是的,你是对的。在发布问题之前,我做了几个小时的研究。但是我找不到如何在两个日期之间进行分组的方法。无论如何,谢谢!

标签: sql postgresql


【解决方案1】:

我在 Postgres 中使用 generate_series 函数解决了问题。这就是我一直在寻找的。这个link 帮助了我。根据日期将单行拆分为多行

SELECT hotel_id,mnth,visits, 
  ROW_NUMBER() OVER (PARTITION BY mnth ORDER BY visits DESC) AS rnk FROM (
    SELECT hotel_id,to_char(live_mnth,'YYYY-MM') AS mnth,count(*) AS visits FROM (
        SELECT id,usr_id,hotel_id,date_in,date_out,
        generate_series(date_in, date_out, '1 MONTH')::DATE AS live_mnth
        FROM (
            SELECT *,TO_CHAR(srch_ci, 'yyyy-mm-01')::date AS date_in,
                    TO_CHAR(srch_co, 'yyyy-mm-01')::date AS date_out 
               FROM hotels 
        ) s
    ) s GROUP BY hotel_id,to_char(live_mnth,'YYYY-MM')
) t

【讨论】:

  • 由于 srch_ci 已经是 date 数据类型,您可以将 to_char(srch_ci, 'yyyy-mm-01')::date 简化为更简单的(恕我直言)date_trunc('month', srch_ci)。这显然适用于srch_co。见Date Functions。注意:一旦正确定义/存储日期列,几乎没有理由将其转换为字符串,除了最终 display.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多