Sql 最近旅行的乘客
选择不同的乘客 从桌子上 旅行日期在最近两个月内 按乘客分组 当查询在10月-9月和8月运行时,应提取数据。 在11月-9月和10月运行时,应提取数据 在上述示例中,乘客1应被牵引,因为他在8月和9月都旅行过。乘客2号和3号不应被牵引。使用下面的查询Sql 最近旅行的乘客,sql,amazon-redshift,Sql,Amazon Redshift,选择不同的乘客 从桌子上 旅行日期在最近两个月内 按乘客分组 当查询在10月-9月和8月运行时,应提取数据。 在11月-9月和10月运行时,应提取数据 在上述示例中,乘客1应被牵引,因为他在8月和9月都旅行过。乘客2号和3号不应被牵引。使用下面的查询 Select passenger FROM travel WHERE DATEDIFF(month, travel_date, CURRENT_TIMESTAMP)<=2 group BY passenger 对于获取当前日期,可以使用g
Select passenger FROM travel
WHERE DATEDIFF(month, travel_date, CURRENT_TIMESTAMP)<=2
group BY passenger
对于获取当前日期,可以使用getdate或current_时间戳。
如果你想要全部的细节,你不需要分组
我将使用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;
这使用countdistinct,因为它是可归纳的。例如,对于过去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, travel_date, GETDATE()) <= 2
AND MONTH(travel_date) != MONTH(GETDATE())
如果要验证代码,只需运行以下脚本:
你试过什么?你被卡在哪里了?堆栈溢出不会为您编写整个解决方案。请参见:切切实实地说,因为这出现在它的表面上是一个家庭作业/课程作业的问题,请考虑发布你的作业的学术完整性的含义,而不显示在解决问题之前的善意的努力。@下面是我所尝试的,选择不同的乘客,表中的旅行日期,其中旅行日期>=dateadd'month',-2,date_trunc'month',sysdate和旅行日期
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]