SQL-根据日期范围高效地选择数据
我希望根据表中的日期范围选择数据,并获取该日期范围之前的最新值 我怎样才能提高效率 该表定义如下:SQL-根据日期范围高效地选择数据,sql,sql-server,Sql,Sql Server,我希望根据表中的日期范围选择数据,并获取该日期范围之前的最新值 我怎样才能提高效率 该表定义如下: Name varchar(100) Checked DataType varchar(100) Checked Time datetime Checked Value int Checked 该表包含以下数据: Name DataType Time Value Nam
Name varchar(100) Checked
DataType varchar(100) Checked
Time datetime Checked
Value int Checked
该表包含以下数据:
Name DataType Time Value
Name1 Type1 2010-09-29 17:29:00.000 999
Name2 Type2 2013-11-02 06:51:00.000 0
我创建了下面的查询,虽然有点冗长,但它确实返回了正确的结果。但是,我想知道是否可以使用更好的T-SQL实现这一点
我将在我的应用程序中以内嵌SQL的形式编写代码
DECLARE @effectiveFrom DATETIME
SET @effectiveFrom = '2010-09-29 17:30:00'
DECLARE @effectiveTo DATETIME
SET @effectiveTo = '2010-09-29 17:49:00'
DECLARE @bmunit varchar(100)
DECLARE @datatype varchar(100)
--Select * from [Table]
--where (Time >= '2010-09-29 17:30:00' and Time < '2010-09-29 17:49:00')
--union Select top 1 * from [Table]
-- where Time < '2010-09-29 17:30:00' order by Time desc
SELECT P1.[Name]
,P1.[DataType]
,P1.[Time]
,P1.[Value]
,P1.Que
FROM
(
SELECT [Name]
,[DataType]
,[Time]
,[Value]
, 'between' AS [Que]
FROM [Table]
WHERE Time >= @effectiveFrom AND EffectiveTime < @effectiveTo
) P1
UNION SELECT P2.[Name]
,P2.[DataType]
,P2.[Time]
,P2.[Value]
, 'before' AS [Que]
FROM
(
SELECT TOP 1 [Name]
,[DataType]
,Time]
,[Value]
FROM [Table] P1
WHERE Time < @effectiveFrom
) P2 --ON P1.[Name] = P2.[Name] AND P1.[DataType] = P2.[DataType]
WHERE Name = 'MyName' --AND P1.Time >= @effectiveFrom AND P1.Time < @effectiveTo
ORDER BY 2,3
您应该能够将其缩减为以下内容:
SELECT P1.[Name]
,P1.[DataType]
,P1.[Time]
,P1.[Value]
,'between' AS Que
FROM [Table] P1
WHERE Time >= @effectiveFrom AND Time < @effectiveTo
AND Name = 'MyName'
UNION ALL
SELECT * FROM (
SELECT TOP 1 P2.[Name]
,P2.[DataType]
,P2.[Time]
,P2.[Value]
,'before' AS [Que]
FROM [Table] P2
WHERE Time < @effectiveFrom
AND Name = 'MyName'
ORDER BY 3
) A
如果不喜欢重复名称检查,则选择将变得更大:
SELECT * FROM (
SELECT P1.[Name]
,P1.[DataType]
,P1.[Time]
,P1.[Value]
,'between' AS Que
FROM [Table] P1
WHERE Time >= @effectiveFrom AND Time < @effectiveTo
UNION ALL
SELECT * FROM (
SELECT TOP 1 P2.[Name]
,P2.[DataType]
,P2.[Time]
,P2.[Value]
,'before' AS [Que]
FROM [Table] P2
WHERE Time < @effectiveFrom
ORDER BY 3
) A
) B
WHERE Name = 'MyName'
如果你想把它缩短,你可以试试这个,但我认为它不太可读:
SELECT P1.[Name]
,P1.[DataType]
,P1.[Time]
,P1.[Value]
,(CASE WHEN Time >= @effectiveFrom THEN 'between' ELSE 'before' END) AS Que
FROM [Table] P1
WHERE Name = 'MyName'
AND
(
(Time >= @effectiveFrom AND Time < @effectiveTo)
OR (Time < @effectiveFrom AND NOT EXISTS (SELECT *
FROM [Table] P2
WHERE Time < @effectiveFrom
AND P2.Time > P1.Time)
)
)
它更短吗?哪一个是您的RDBMS?MySQL还是SQL Server?