Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL查询中的SQL DATEDIFF_Sql Server - Fatal编程技术网

Sql server SQL查询中的SQL DATEDIFF

Sql server SQL查询中的SQL DATEDIFF,sql-server,Sql Server,我有两张桌子供顾客和顾客使用: 客户表格: +------------+-----------+----------+ | CustomerID | FirstName | Surname | +------------+-----------+----------+ | 101 | Jeff | Smith | | 102 | Alex | Jones | | 103 | Pam | Clark |

我有两张桌子供顾客和顾客使用:

客户表格:

+------------+-----------+----------+
| CustomerID | FirstName | Surname  |
+------------+-----------+----------+
|        101 | Jeff      | Smith    |
|        102 | Alex      | Jones    |
|        103 | Pam       | Clark    |
|        104 | Zola      | Lona     |
|        105 | Simphele  | Ndima    |
|        106 | Andre     | Williams |
|        107 | Wayne     | Shelton  |
|        108 | Bob       | Banard   |
|        109 | Ken       | Davidson |
|        110 | Sally     | Ivan     |
+------------+-----------+----------+
+------------+--------------+------------+-----------+
| PurchaseId | PurchaseDate | CustomerID | ProductID |
+------------+--------------+------------+-----------+
|          1 | 2012-08-15   |        105 | a510      |
|          2 | 2012-08-15   |        102 | a510      |
|          3 | 2012-08-15   |        103 | a506      |
|          4 | 2012-08-16   |        105 | a510      |
|          5 | 2012-08-17   |        106 | a507      |
|          6 | 2012-08-17   |        107 | a509      |
|          7 | 2012-08-18   |        108 | a502      |
|          8 | 2012-08-19   |        108 | a510      |
|          9 | 2012-08-19   |        109 | a502      |
|         10 | 2012-08-20   |        110 | a503      |
|         11 | 2012-08-21   |        101 | a510      |
|         12 | 2012-08-22   |        102 | a507      |
+------------+--------------+------------+-----------+
采购表格:

+------------+-----------+----------+
| CustomerID | FirstName | Surname  |
+------------+-----------+----------+
|        101 | Jeff      | Smith    |
|        102 | Alex      | Jones    |
|        103 | Pam       | Clark    |
|        104 | Zola      | Lona     |
|        105 | Simphele  | Ndima    |
|        106 | Andre     | Williams |
|        107 | Wayne     | Shelton  |
|        108 | Bob       | Banard   |
|        109 | Ken       | Davidson |
|        110 | Sally     | Ivan     |
+------------+-----------+----------+
+------------+--------------+------------+-----------+
| PurchaseId | PurchaseDate | CustomerID | ProductID |
+------------+--------------+------------+-----------+
|          1 | 2012-08-15   |        105 | a510      |
|          2 | 2012-08-15   |        102 | a510      |
|          3 | 2012-08-15   |        103 | a506      |
|          4 | 2012-08-16   |        105 | a510      |
|          5 | 2012-08-17   |        106 | a507      |
|          6 | 2012-08-17   |        107 | a509      |
|          7 | 2012-08-18   |        108 | a502      |
|          8 | 2012-08-19   |        108 | a510      |
|          9 | 2012-08-19   |        109 | a502      |
|         10 | 2012-08-20   |        110 | a503      |
|         11 | 2012-08-21   |        101 | a510      |
|         12 | 2012-08-22   |        102 | a507      |
+------------+--------------+------------+-----------+
我的问题(过去两天我一直在努力解决):创建一个查询,显示自上次购买产品五天或更长时间后购买产品的所有客户

预期产出:

+-----------+------------------+
| Firstname |   Daysdifference |
+-----------+------------------+
|  Alex     |                7 |
+-----------+------------------+
给你:

DECLARE @Customers TABLE (CustomerID INT, FirstName VARCHAR(30), Surname VARCHAR(30));
DECLARE @Purchases TABLE (PurchaseId INT, PurchaseDate DATE, CustomerID INT, ProductID VARCHAR(10) );
/**/
INSERT INTO @Customers VALUES
(101,'Jeff    ' , 'Smith   '),
(102,'Alex    ' , 'Jones   '),
(103,'Pam     ' , 'Clark   '),
(104,'Zola    ' , 'Lona    '),
(105,'Simphele' , 'Ndima   '),
(106,'Andre   ' , 'Williams'),
(107,'Wayne   ' , 'Shelton '),
(108,'Bob     ' , 'Banard  '),
(109,'Ken     ' , 'Davidson'),
(110,'Sally   ' , 'Ivan    ');

INSERT INTO @Purchases VALUES
(1, '2012-08-15' ,105, 'a510'),
(2, '2012-08-15' ,102, 'a510'),
(3, '2012-08-15' ,103, 'a506'),
(4, '2012-08-16' ,105, 'a510'),
(5, '2012-08-17' ,106, 'a507'),
(6, '2012-08-17' ,107, 'a509'),
(7, '2012-08-18' ,108, 'a502'),
(8, '2012-08-19' ,108, 'a510'),
(9, '2012-08-19' ,109, 'a502'),
(10,'2012-08-20' ,110, 'a503'),
(11,'2012-08-21' ,101, 'a510'),
(12,'2012-08-22' ,102, 'a507');
--
WITH CTE AS (
    SELECT Pur1.CustomerID, DATEDIFF(DAY, Pur1.PurchaseDate, Pur2.PurchaseDate) Daysdifference
    FROM @Purchases Pur1 INNER JOIN @Purchases Pur2 ON Pur1.CustomerID = Pur2.CustomerID
    )
    SELECT Cus.FirstName, CTE.Daysdifference
    FROM @Customers Cus INNER JOIN CTE ON Cus.CustomerID = CTE.CustomerID
    WHERE CTE.Daysdifference >= 5;
结果:

+-----------+------------------+
| Firstname |   Daysdifference |
+-----------+------------------+
|  Alex     |                7 |
+-----------+------------------+

您可以这样解决:

  • 根据日期描述创建排名,并按客户id划分
  • 下一步检查连续级别之间的日期差异以查找这些客户
  • 下面的查询

     ; with cte as 
    (
    select 
      *, 
      row_number() over(partition by CustomerID order by PurchaseDate desc) r
    from 
    Purchases 
    )
    
    
    select 
    Name= c.FirstName, 
    Daysdifference =datediff(d,c1.PurchaseDate, c2.PurchaseDate) 
     from 
    Customers c join
    cte c1 
      on c.customerid=c1.customerid
    join cte c2 
      on c1.CustomerID=c2.CustomerId 
      and c1.r-1=c2.r
      and datediff(d,c1.PurchaseDate, c2.PurchaseDate) >=5
    

    自从SQL Server 2012和添加了滞后和超前功能以来,根本没有理由对这样的东西进行自联接

    注意。。。与其他方法相比,排名函数可能非常有效,但它们确实需要适当索引的帮助才能发挥最佳效果(请注意测试脚本中的附加POC索引)

    结果

    FirstName                      Daysdifference
    ------------------------------ --------------
    Alex                           7
    

    你为什么到目前为止都在尝试?看起来像是为我做家务的问题,至少表现出一些努力。