如何解决最近旅行的乘客
选择不同的乘客 从表 最近两个月的旅行日期 按乘客分组
在10月-9月和8月运行查询时,应提取数据。 在11月-9月和10月运行时,应提取数据。
在上面的示例中,应该拉“乘客1”,因为他在8月和9月都曾旅行。请勿拉扯“乘客2和3”。
解决方法
我将使用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个旅行过的人调整此查询。
我已理解您的要求为选择最近两个月(从今天起)每个月至少旅行一次的乘客(不包括当月旅行的人)。
所需的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,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,'a')
INSERT INTO [dbo].[tblTravels] VALUES (3,'a')
GO
SELECT *
FROM [dbo].[tblTravels]
GO
WITH cte
AS (
SELECT passenger AS passenger,MONTH(travel_date)
)
SELECT passenger
FROM cte
GROUP BY passenger
HAVING COUNT(*) > 1
DROP TABLE [dbo].[tblTravels]
,
使用以下查询
Select passenger FROM travel
WHERE DATEDIFF(month,CURRENT_TIMESTAMP)<=2
group BY passenger
获取当前日期可以使用 getdate()或 current_timestamp 。
而且,如果您希望获得全部详细信息,则不必分组。
Select passenger,travel_id FROM travel
WHERE DATEDIFF(month,travel_data,CURRENT_TIMESTAMP)<=2
order by passenger
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。