最近旅行的乘客

Posted

技术标签:

【中文标题】最近旅行的乘客【英文标题】: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 红移试验。以后也会标记这个。谢谢 【参考方案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

【讨论】:

感谢您的回答。

以上是关于最近旅行的乘客的主要内容,如果未能解决你的问题,请参考以下文章

独木舟上的旅行

南阳OJ独木舟上的旅行

独木舟上的旅行

独木舟上的旅行

[ARC061E]すぬけ君の地下鉄旅行 / Snuke's Subway Trip

415. [HAOI2009] 旅行