【问题标题】:Passengers who travelled recently最近旅行的乘客
【发布时间】:2020-10-26 03:26:35
【问题描述】:

选择不同的乘客 从表 旅行日期在过去 2 个月的每个月中 按乘客分组

在 10 月运行查询时,应提取 9 月和 8 月的数据。 在 11 月 - 9 月和 10 月运行时,应提取数据。

在上面的示例中,应该拉出“乘客 1”,因为他在 8 月和 9 月都在旅行。 “乘客 2&3”不应被拉走。

【问题讨论】:

  • 你试过什么?你在哪里卡住? Stack Overflow 不会为您编写整个解决方案。另请参阅:How to Ask(切题,因为这从表面上看是一个家庭作业/课程作业问题,请考虑在没有表现出事先解决问题的善意努力的情况下发布作业的学术诚信影响。)
  • @esqew 下面是我尝试过的,从表中选择不同的乘客、旅行日期,其中旅行日期 >= dateadd('month', -2, date_trunc('month', sysdate)) 和旅行日期
  • @a_horse_with_no_name 红移试验。以后也会标记这个。谢谢

标签: sql amazon-redshift


【解决方案1】:

我会使用date_trunc() 进行日期过滤。那么:

select t.passenger
from t
where travel_date >= date_trunc('month', current_date) - interval '2 month' and
      travel_date < date_trunc('month', current_date)
group by t.passenger
having count(distinct date_trunc('month', travel_date)) = 2;

这使用count(distinct),因为它是可泛化的。例如,对于过去 6 个月中有 4 个月旅行过的人可以轻松调整此查询。

【讨论】:

    【解决方案2】:

    我已将您的要求理解为选择过去两个月(从今天起)每月至少旅行一次的乘客,不包括当月的旅行

    所需的SQL代码:

    WITH cte
    AS (
        SELECT passenger AS passenger
            ,MONTH(travel_date) AS travel_month
            ,COUNT(*) AS number_of_travels
        FROM [dbo].[tblTravels]
        WHERE DATEDIFF(month, travel_date, GETDATE()) <= 2
            AND MONTH(travel_date) != MONTH(GETDATE())
        GROUP BY passenger
            ,MONTH(travel_date)
        )
    SELECT passenger
    FROM cte
    GROUP BY passenger
    HAVING COUNT(*) > 1
    

    关于答案的更多解释: 获取从今天开始的最后两个月,不包括当前月份

    DATEDIFF(month, travel_date, GETDATE()) <= 2
            AND MONTH(travel_date) != MONTH(GETDATE())
    

    如果您想验证代码,只需运行以下脚本:

    CREATE TABLE [dbo].[tblTravels] (
        [passenger] [int] NULL
        ,[travel_date] [datetime] NULL
        ,[travel_id] [nchar](10) NULL
        ) ON [PRIMARY]
    
    DELETE FROM [dbo].[tblTravels]
    
    INSERT INTO [dbo].[tblTravels] VALUES (1, '2020-08-01', 'a')
    INSERT INTO [dbo].[tblTravels] VALUES (1, '2020-09-01', 'a')
    INSERT INTO [dbo].[tblTravels] VALUES (2, '2020-08-01', 'a')
    INSERT INTO [dbo].[tblTravels] VALUES (3, '2020-09-01', 'a')
    GO
    
    SELECT *
    FROM [dbo].[tblTravels]
    GO
    
    WITH cte
    AS (
        SELECT passenger AS passenger
            ,MONTH(travel_date) AS travel_month
            ,COUNT(*) AS number_of_travels
        FROM [dbo].[tblTravels]
        WHERE DATEDIFF(month, travel_date, GETDATE()) <= 2
            AND MONTH(travel_date) != MONTH(GETDATE())
        GROUP BY passenger
            ,MONTH(travel_date)
        )
    SELECT passenger
    FROM cte
    GROUP BY passenger
    HAVING COUNT(*) > 1
    
    DROP TABLE [dbo].[tblTravels]
    

    【讨论】:

      【解决方案3】:

      使用下面的查询

      Select passenger FROM travel
      WHERE  DATEDIFF(month, travel_date, CURRENT_TIMESTAMP)<=2
      group BY passenger
      

      获取当前日期可以使用 getdate()current_timestamp
      如果您想要完整的详细信息,则不必分组。

      Select passenger,travel_date,travel_id FROM travel
      WHERE  DATEDIFF(month, travel_data, CURRENT_TIMESTAMP)<=2
      order by passenger
      

      【讨论】:

      • 感谢您的回答。
      猜你喜欢
      • 2015-09-14
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 2010-10-26
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      相关资源
      最近更新 更多