SQL:根据前几行值返回列值

时间:2015-05-22 06:28:52

标签: sql sql-server relational-database

我有一张类似这样的表

NAME    TIME                    IsTrue
A       15-05-2015 02:00        0
B       15-05-2015 03:00        1
C       15-05-2015 06:00        0
D       15-05-2015 13:00        0
E       15-05-2015 23:00        0
F       16-05-2015 04:00        0
E       16-05-2015 07:00        1
G       16-05-2015 23:00        0

我正在尝试编写一个查询,其输出应该是这样的

NAME    TIME                    IsTrue
A       15-05-2015 02:00        0
B       15-05-2015 03:00        1
C       15-05-2015 06:00        1
D       15-05-2015 13:00        1
E       15-05-2015 23:00        1
F       16-05-2015 04:00        0
E       16-05-2015 07:00        1
G       16-05-2015 23:00        1

您可以在此处观察IsTrue的值是在过去24小时中的任何行的值为1的条件下设置的。

我不想在表中进行更改,只是返回值。 有人可以帮忙吗?

提前致谢,

关心,Ganesh。

P.S。如果重要的话,我正在使用Microsoft SQL Server。

3 个答案:

答案 0 :(得分:1)

试试这个

with cte as
(
Select Row_Number() over(Partition by convert(date,Time) order by Time)as Rno,Name,Istrue,time from test
)
select Rno,Name,Time,Case when Rno>1 then 1 else 0 end as Istrue  from cte

请检查工作 DEMO

答案 1 :(得分:1)

这是最简单的,但性能方面的次优解决方案。它使用相关的子查询来计算每一行:

SELECT 
    [NAME]
  , [TIME]
  , (SELECT MAX(IsTrue+0) FROM TABLE1 it WHERE DATEADD(DD,1,it.TIME) > ot.TIME AND it.TIME <= ot.Time) [ISTRUE]
FROM Table1 ot

我没有你有多少数据。它可以很好地使用这个示例,但是如果你有数百万行,我们可能需要寻找更好的东西。

<强> SQLFiddle DEMO

注意MAX(IsTrue)中的+0以启用位列上的聚合函数

答案 2 :(得分:0)

你可以写成:

-- now get all records with desired results
SELECT DISTINCT T3.NAME
      ,T3.[Time]
      ,case when T4.NAME  IS NULL THEN 0 ELSE 1 END AS IsTrue
FROM  @Test T3 
LEFT  JOIN 
(
-- get all rows for which Istrue condition holds true 
SELECT T1.NAME,T1.[Time]
FROM @Test T1
WHERE EXISTS ( SELECT IsTrue 
               FROM @Test T2
               WHERE DATEDIFF (hh,T2.Time,T1.Time) BETWEEN 0 AND 24 AND T2.IsTrue = 1)
) T4  ON T3.NAME = T4.NAME AND T3.[Time] = T4.[Time]  
ORDER BY T3.[Time]   

DEMO