日期间隔 SQL

Posted

技术标签:

【中文标题】日期间隔 SQL【英文标题】:Date Interval SQL 【发布时间】:2021-04-04 07:36:46 【问题描述】:

我有一个包含货运数据的数据库。我正在尝试获取平均运费最高的三个船舶国家。我只想使用最近 12 个月的订单数据,使用 Orders 表中的最后一个订单日期作为结束日期。 Orders 表的前 10 个条目是:

我无法弄清楚如何为开始日期创建条件。我写的查询是:

SELECT ShipCountry, ROUND(AVG(Freight),2) AS AverageFreight
FROM [dbo].[Orders]
WHERE YEAR(OrderDate) < YEAR(MAX(OrderDate)) 
GROUP BY ShipCountry
ORDER BY AverageFreight DESC

我在这个查询中遇到的错误是:

聚合可能不会出现在 WHERE 子句中,除非它出现在 HAVING 子句或选择列表中包含的子查询中,并且被聚合的列是外部引用。

更新

我使用以下查询解决了这个问题:

SELECT TOP 3 ShipCountry, ROUND(AVG(Freight), 2) AS AverageFreight
FROM [dbo].[Orders]
WHERE OrderDate >= (SELECT DATEADD(mm,-12,(SELECT MAX(OrderDate) FROM [dbo].[Orders]))) 
GROUP BY ShipCountry
ORDER BY AverageFreight DESC

【问题讨论】:

您可以编辑您的问题并将您的查询作为您自己的答案。 我删除了不一致的数据库标签。请仅使用您真正使用的数据库进行标记。 请不要将您的解决方案放在您的问题中。添加答案并自我接受。 当然!我会解决的! 【参考方案1】:

您可以使用窗口函数来做到这一点:

SELECT ShipCountry, ROUND(AVG(Freight),2) AS AverageFreight
FROM (SELECT o.*, MAX(OrderDate) OVER() as MaxOrderDate FROM [dbo].[Orders] o) o
WHERE OrderDate >= DATEADD(year, -1, MaxOrderDate) 
GROUP BY ShipCountry
ORDER BY AverageFreight DESC

【讨论】:

【参考方案2】:

我使用以下查询解决了这个问题:

SELECT TOP 3 ShipCountry, ROUND(AVG(Freight), 2) AS AverageFreight
FROM [dbo].[Orders]
WHERE OrderDate >= (SELECT DATEADD(mm,-12,(SELECT MAX(OrderDate) FROM [dbo].[Orders]))) 
GROUP BY ShipCountry
ORDER BY AverageFreight DESC

【讨论】:

以上是关于日期间隔 SQL的主要内容,如果未能解决你的问题,请参考以下文章

SQL日期相关的语句

日期间隔 SQL

具有时间间隔的 SQL 日期时间

用于显示多个日期范围之间的间隔的 SQL 查询

日期停止时 SQL 中所有记录的输出日期(必须是一个月的间隔)

db2 计算间隔天数