将查询结果用于另一个查询sql

时间:2015-06-08 11:54:33

标签: sql-server sql-server-2005

我知道讨论嵌套查询的主题很多,但是由于我正在使用的函数,我的嵌套查询出错了。

示例数据:

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天。

1 个答案:

答案 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)