TSQL语法将结果提供给子查询

时间:2018-02-07 18:36:03

标签: sql sql-server

我是在如何最好地编写执行以下操作的查询之后获得了一些帮助。我想我需要一个子查询,但我不知道如何使用行中返回的数据反馈到子查询中而没有硬编码值?子查询在这里可能不正确吗?

理想情况下,我只需要1个变量...WHERE t_Date = '2018-01-01'

期望输出:

enter image description here

COUNT Criteria列具有以下规则

日期<当前行

区域=当前行

名称=当前行

值= 1

例如,第一行表示有2条记录Date < '2018-01-01' AND Area = 'Area6' AND Name = 'Name1' AND Value = 1

示例数据:

SQLFiddle:http://sqlfiddle.com/#!18/92ba3/4

实际上我只想返回前两行,但是根据该列的输出将历史数据汇总到一列中。

enter image description here

2 个答案:

答案 0 :(得分:1)

使用自联接查找同一表中与特定记录相关的记录:

SELECT  t1.t_Date,  t1.t_Area,  t1.t_Name, t1.t_Value,
COUNT(t2.t_Name) AS COUNTCriteria
FROM Table1 as t1
LEFT OUTER JOIN Table1 as t2
ON t1.t_Area=t2.t_Area
AND t1.t_Name=t2.T_Name
AND t2.t_Date<t1.t_Date
AND t2.t_Value=1
GROUP BY  t1.t_Date,  t1.t_Area,  t1.t_Name, t1.t_Value

答案 1 :(得分:1)

执行此操作的正确方法是使用自2012年以来ANSI SQL和SQL Server中的累积和功能:

select t.*,
       sum(case when t.value = 1 then 1 else 0 end) over (partition by t_area, t_name order by t_date)
from t;

这实际上包括当前行。如果每个日期只有一行(对于区域/名称组合),那么您可以减去它或使用窗口子句:

select t.*,
       sum(case when t.value = 1 then 1 else 0 end) over
           (partition by t_area, t_name
            order by t_date
            rows between unbounded preceding and 1 preceding
           )
from t;