我知道讨论嵌套查询的主题很多,但是由于我正在使用的函数,我的嵌套查询出错了。
示例数据:
Sample TestDate Column:
2015-05-13 13:45:14.000
2015-05-15 07:33:13.000
2015-05-18 06:07:11.000
2015-05-19 02:58:13.000
2015-05-22 14:08:42.000
2015-05-26 11:01:29.000
2015-05-26 11:01:50.000
2015-05-27 07:19:32.000
2015-05-15 08:04:28.000
2015-05-15 10:32:23.000
2015-05-22 14:11:26.000
2015-05-27 07:16:57.000
2015-05-29 08:50:36.000
2015-05-15 10:38:23.000
2015-05-19 03:08:53.000
2015-05-27 13:41:47.000
2015-05-29 08:47:56.000
2015-05-15 07:50:04.000
2015-05-18 06:20:28.000
2015-05-19 06:32:24.000
2015-05-26 11:00:58.000
2015-05-22 14:12:15.000
2015-05-26 10:57:17.000
我希望查询过去7个日期的数据(可能不是最近7天)。
我使用数据返回最后7个日期的查询效果很好。
-- Set the return record count to the last 7 days
SET ROWCOUNT 7
--Get the Distinct Dates
SELECT DISTINCT(CONVERT(VARCHAR, CONVERT(DATETIME,[TestDate]),23)) AS DT
FROM [SERVER].[dbo].[TABLE]
--Get the last 60 days
WHERE [TestDate] BETWEEN (Getdate() - 60) AND Getdate()
--Start at the current date and go backwards.
ORDER BY DT DESC
-- reset the return record count to prevent issues with further queries.
SET ROWCOUNT 0
这提供了以下结果:
DT
2015-05-29
2015-05-27
2015-05-26
2015-05-22
2015-05-19
2015-05-18
2015-05-15
现在,我想使用这7个条目来提取这些日期的数据。
通常我会做一个
SELECT * WHERE [TestDate] >= '2015-05-29' AND [TestDate] <= '2015-05-30'
例如(我知道很麻烦)。
A)我在嵌套查询中遇到SET函数错误。
B)如何制作正确的WHERE语句。一种选择是使用查询中的第一个和最后一个结果(2015-05-29和2015-05-15)
(WHERE [TestDate] >= 'FIRST_RESULT' AND [TestDate] <= 'LAST_RESULT')
编辑:
因此,从我上面添加的表中,我想要2015-05-15 - 2015-05-29的数据(即查询结果),但不是来自2015-05-13日期的数据,因为第13天的数据是第8天。
答案 0 :(得分:0)
这将为您提供最后7个包含数据的日期,而无需执行您在示例代码中执行的操作:
SELECT DISTINCT TOP 7
CAST([TestDate] AS DATE) DT
FROM YourTable
ORDER BY CAST([TestDate] AS DATE) DESC
我已将它们转换为DATE
以获取日期部分。
您可以将其用于JOIN
on,这会将输出限制为具有匹配日期的行:
SELECT *
FROM YourTable t1
INNER JOIN ( SELECT DISTINCT TOP 7
CAST(TestDate AS DATE) DT
FROM YourTable
ORDER BY CAST(TestDate AS DATE) DESC
) dts ON dts.DT = CAST(t1.TestDate AS DATE)