将自连接转换为分区的SQL语法

将自连接转换为分区的SQL语法,sql,sql-server,Sql,Sql Server,我可以重新编写这个查询 问题1: SELECT t1.*, COUNT(t2.t_Name) AS CountMatches FROM Table1 t1 LEFT OUTER JOIN (SELECT * FROM Table1) 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' WHERE t1.[t_Dat

我可以重新编写这个查询

问题1:

SELECT t1.*, COUNT(t2.t_Name) AS CountMatches
FROM
Table1 t1
LEFT OUTER JOIN
(SELECT * FROM Table1) 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'
WHERE t1.[t_Date] = '2018-01-01'
GROUP BY t1.[t_Date], t1.[t_Area], t1.[t_Name], t1.[t_Length], t1.[t_Value]
我试图添加一个额外的术语,但在语法方面遇到了困难


如何将以下术语添加到Query2和abs1。[t_Length]-t2。[t_Length]您正在窗口函数中混合来自当前行和前几行的值。不幸的是,这无法表达

在SQL Server中,可以改用“应用”:


就性能而言,这为您节省了外部聚合。

示例数据和所需结果将非常有用。这应该是问题本身。您使用的是哪个版本的sql server?
SELECT t2.* 
FROM
(
  SELECT t1.*, SUM(CASE WHEN t1.[t_Value] = '1' THEN 1 ELSE 0 END) 
  OVER (PARTITION BY t1.[t_Area], t1.[t_Name]
  ORDER BY t1.[t_Date] ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS CountMatches
  FROM Table1 t1
) t2

WHERE t2.[t_Date] = '2018-01-01'
SELECT t1.*, COUNT(t2.t_Name) AS CountMatches
FROM
Table1 t1
LEFT OUTER JOIN
(SELECT * FROM Table1) 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'
AND ABS(t1.[t_Length] - t2.[t_Length]) <= 1 --(Need this term as well)
WHERE t1.[t_Date] = '2018-01-01'
GROUP BY t1.[t_Date], t1.[t_Area], t1.[t_Name], t1.[t_Length], t1.[t_Value]
CREATE TABLE Table1
    ([t_Date] datetime, [t_Area] varchar(10), [t_Name] varchar(10), [t_Length] int, [t_Value] int);

INSERT INTO Table1 ([t_Date], [t_Area], [t_Name], [t_Length], [t_Value])
VALUES
('2018-01-01 00:00:00.000',' Area6', 'Name1', 10, 6),
('2018-01-01 00:00:00.000',' Area5', 'Name2', 9, 2),
('2017-12-15 00:00:00.000',' Area6', 'Name1', 8, 5),
('2017-11-25 00:00:00.000',' Area14', 'Name2', 7, 5),
('2017-11-18 00:00:00.000',' Area6', 'Name1', 10, 2),
('2017-11-13 00:00:00.000',' Area3', 'Name2', 9, 8),
('2017-10-28 00:00:00.000',' Area6', 'Name1', 8, 1),
('2017-10-04 00:00:00.000',' Area2', 'Name1', 7, 2),
('2017-08-26 00:00:00.000',' Area4', 'Name1', 10, 3),
('2017-02-25 00:00:00.000',' Area7', 'Name1', 9, 8),
('2017-02-18 00:00:00.000',' Area12', 'Name1', 8, 5),
('2017-01-25 00:00:00.000',' Area18', 'Name2', 7, 2),
('2017-01-01 00:00:00.000',' Area5', 'Name2', 10, 2),
('2016-12-27 00:00:00.000',' Area7', 'Name1', 9, 1),
('2016-12-09 00:00:00.000',' Area6', 'Name1', 8, 5),
('2016-12-01 00:00:00.000',' Area16', 'Name2', 7, 2),
('2016-11-12 00:00:00.000',' Area6', 'Name1', 10, 1),
('2016-10-27 00:00:00.000',' Area24', 'Name2', 9, 8),
('2016-10-22 00:00:00.000',' Area6', 'Name1', 8, 7),
('2016-09-30 00:00:00.000',' Area13', 'Name2', 7, 2),
('2016-09-24 00:00:00.000',' Area19', 'Name1', 10, 1),
('2016-08-20 00:00:00.000',' Area21', 'Name2', 9, 3),
('2016-07-26 00:00:00.000',' Area21', 'Name2', 8, 1),
('2016-07-17 00:00:00.000',' Area26', 'Name2', 7, 2),
('2016-06-24 00:00:00.000',' Area4', 'Name1', 10, 3),
('2016-06-01 00:00:00.000',' Area4', 'Name1', 9, 2),
('2016-05-29 00:00:00.000',' Area15', 'Name2', 8, 8),
('2016-05-10 00:00:00.000',' Area25', 'Name1', 7, 3),
('2016-05-05 00:00:00.000',' Area31', 'Name2', 10, 1),
('2016-04-13 00:00:00.000',' Area6', 'Name1', 9, 2),
('2016-04-03 00:00:00.000',' Area3', 'Name2', 8, 7),
('2016-03-09 00:00:00.000',' Area5', 'Name2', 7, 3),
('2016-02-27 00:00:00.000',' Area7', 'Name1', 10, 10),
('2016-02-06 00:00:00.000',' Area23', 'Name1', 9, 1),
('2016-01-01 00:00:00.000',' Area6', 'Name1', 8, 3),
('2015-12-08 00:00:00.000',' Area28', 'Name1', 7, 4),
('2015-11-10 00:00:00.000',' Area17', 'Name1', 10, 3),
('2015-05-17 00:00:00.000',' Area19', 'Name2', 9, 7),
('2015-04-24 00:00:00.000',' Area7', 'Name1', 8, 1),
('2015-04-21 00:00:00.000',' Area18', 'Name2', 7, 3),
('2015-04-07 00:00:00.000',' Area9', 'Name1', 10, 8),
('2015-03-11 00:00:00.000',' Area6', 'Name1', 9, 10),
('2015-02-27 00:00:00.000',' Area8', 'Name2', 8, 5),
('2015-02-24 00:00:00.000',' Area5', 'Name2', 7, 1),
('2015-02-17 00:00:00.000',' Area30', 'Name2', 10, 1),
('2015-01-31 00:00:00.000',' Area23', 'Name1', 9, 6),
('2015-01-23 00:00:00.000',' Area8', 'Name2', 8, 1),
('2015-01-10 00:00:00.000',' Area29', 'Name1', 7, 4),
('2014-12-26 00:00:00.000',' Area24', 'Name2', 10, 5),
('2014-12-13 00:00:00.000',' Area6', 'Name1', 9, 2),
('2014-11-15 00:00:00.000',' Area6', 'Name1', 8, 8),
('2014-10-25 00:00:00.000',' Area7', 'Name1', 7, 6),
('2014-05-24 00:00:00.000',' Area10', 'Name1', 10, 1),
('2014-05-05 00:00:00.000',' Area10', 'Name1', 9, 1),
('2014-04-21 00:00:00.000',' Area7', 'Name1', 8, 2),
('2013-12-26 00:00:00.000',' Area27', 'Name1', 7, 4),
('2013-12-03 00:00:00.000',' Area25', 'Name1', 10, 2),
('2013-11-14 00:00:00.000',' Area18', 'Name1', 9, 4),
('2013-10-23 00:00:00.000',' Area11', 'Name1', 8, 3),
('2013-06-26 00:00:00.000',' Area32', 'Name2', 7, 4),
('2013-06-14 00:00:00.000',' Area1', 'Name2', 10, 6),
('2013-05-18 00:00:00.000',' Area2', 'Name2', 9, 5),
('2013-03-30 00:00:00.000',' Area12', 'Name2', 8, 9),
('2013-02-25 00:00:00.000',' Area22', 'Name1', 7, 1),
('2013-01-08 00:00:00.000',' Area7', 'Name1', 10, 1)
;
SELECT t1.*, tt1.CountMatches
FROM table1 t1 OUTER APPLY
     (SELECT COUNT(*) as CountMatches
      FROM table1 tt1
      WHERE tt1.[t_Area] = t1.[t_Area] AND
            tt1.[t_Name] = t1.[t_Name] AND
            tt1.[t_Date] < t1.[t_Date] AND
            tt1.[t_Value] = '1' AND
            ABS(t1.[t_Length] - tt1.[t_Length]) <= 1 
     ) tt1
WHERE t1.[t_Date] = '2018-01-01';