Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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 斯威林,我会在这里通读所有的答案,以便更好地理解它是如何工作的。 INSERT INTO @OrdersToDelete SELECT TempOrders.Site, TempOrders.Number, TempOrders.RowNumber, Te_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql 斯威林,我会在这里通读所有的答案,以便更好地理解它是如何工作的。 INSERT INTO @OrdersToDelete SELECT TempOrders.Site, TempOrders.Number, TempOrders.RowNumber, Te

Sql 斯威林,我会在这里通读所有的答案,以便更好地理解它是如何工作的。 INSERT INTO @OrdersToDelete SELECT TempOrders.Site, TempOrders.Number, TempOrders.RowNumber, Te,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,斯威林,我会在这里通读所有的答案,以便更好地理解它是如何工作的。 INSERT INTO @OrdersToDelete SELECT TempOrders.Site, TempOrders.Number, TempOrders.RowNumber, TempOrders.CustomerNumber FROM (SELECT ROW_NUMBER() OVER ( PARTITION BY CustomerNumber ORDER BY OrderDate DESC) AS '

斯威林,我会在这里通读所有的答案,以便更好地理解它是如何工作的。
INSERT INTO @OrdersToDelete
SELECT TempOrders.Site, TempOrders.Number, TempOrders.RowNumber, TempOrders.CustomerNumber
FROM (SELECT
        ROW_NUMBER() OVER ( PARTITION BY CustomerNumber ORDER BY OrderDate DESC) AS 'RowNumber',
        Number,
        OrderDate,
        CustomerNumber
    FROM Orders
) TempOrders
LEFT OUTER JOIN (SELECT
        ROW_NUMBER() OVER ( PARTITION BY CustomerNumber ORDER BY OrderDate DESC) AS 'RowNumber',
        Number,
        CustomerNumber
    FROM SmartOrders
) SmartOrderOrders
    ON TempOrders.Site = SmartOrderOrders.Site
        AND TempOrders.Number = SmartOrderOrders.Number
    WHERE
        (DATEDIFF(dd, OrderDate, GETDATE()) > 90
--Get the rownumbers using a case expression in order by 
--so all the orders within the last 90 days come first
WITH ROWNUMS AS (
SELECT
ROW_NUMBER() OVER (PARTITION BY CustomerNumber 
                   ORDER BY 
                   CASE WHEN DATEDIFF(dd, OrderDate, GETDATE()) < 90 THEN 1 ELSE 0 END DESC, 
                   OrderDate DESC) AS 'RowNumber',
Number,
OrderDate,
CustomerNumber
FROM Orders) 
--Get the maximum rownumber per customer in the last 90 days
,MAXROWNUM AS (select CustomerNumber, MAX(rn) maxrn from ROWNUMS 
               where diff<=90 
               group by id)
--Join the previous cte's and get all the orders for a customer in the last 90 days
-- + one more row which is the latest before 90 days
SELECT r.* 
FROM ROWNUMS r
JOIN MAXROWNUM c ON c.CustomerNumber=r.CustomerNumber
WHERE r.rn <= c.maxrn+1 
--use r.rn <= case when c.maxrn <=5 then 5 else c.maxrn end + 1 to get atleast 6 orders per customer
WITH ninety_day_cte
AS
(SELECT temporders.site, temporders.number, temporders.customernumber, temporders.orderdate
FROM orders
WHERE
    temporders.orderdate >= DATEADD(DAY,-ninety,GETDATE())),

ninety_day_count_cte
AS
(SELECT temporders.customernumber, COUNT(*) AS Order_Count
FROM orders
WHERE
    temporders.orderdate >= DATEADD(DAY,-ninety,GETDATE())
GROUP BY
    temporders.customernumber),

greater_ninety_day_cte
AS
(SELECT temporders.site, temporders.number, temporders.customernumber, temporders.orderdate,
    ROW_NUMBER() OVER(PARTITION BY temporders.customernumber ORDER BY temporders.orderdate DESC) AS Row_Number
FROM orders
WHERE
    temporders.orderdate < DATEADD(DAY,-ninety,GETDATE()))
SELECT site, number, customernumber, orderdate
FROM greater_ninety_day_cte AS g
LEFT JOIN ninety_day_count AS c
ON g.customernumber = c.customernumber
WHERE
    g.Row_Number <= CASE
                WHEN  CASE WHEN c.Order_Count IS NULL THEN 0 ELSE c.Order_Count END > 6 THEN 1
                ELSE (6 - CASE WHEN c.Order_Count IS NULL THEN 0 ELSE c.Order_Count END)
            END
UNION ALL
SELECT site, number, customernumber, orderdate
FROM ninety_day_cte
WITH ninety_day_cte
AS
(SELECT temporders.site, temporders.number, temporders.customernumber, temporders.orderdate
FROM orders
WHERE
    temporders.orderdate >= DATEADD(DAY,-ninety,GETDATE())),

ninety_day_count_cte
AS
(SELECT temporders.customernumber, COUNT(*) AS Order_Count
FROM orders
WHERE
    temporders.orderdate >= DATEADD(DAY,-ninety,GETDATE())
GROUP BY
    temporders.customernumber),

greater_ninety_day_cte
AS
(SELECT temporders.site, temporders.number, temporders.customernumber, temporders.orderdate,
    ROW_NUMBER() OVER(PARTITION BY temporders.customernumber ORDER BY temporders.orderdate DESC) AS Row_Number
FROM orders
WHERE
    temporders.orderdate < DATEADD(DAY,-ninety,GETDATE()))

SELECT site, number, customernumber, orderdate
FROM greater_ninety_day_cte AS g
LEFT JOIN ninety_day_count AS c
ON g.customernumber = c.customernumber
WHERE
    g.Row_Number <= CASE
                WHEN  CASE WHEN c.Order_Count IS NULL THEN 0 ELSE c.Order_Count END > 6 THEN 1
                ELSE (6 - CASE WHEN c.Order_Count IS NULL THEN 0 ELSE c.Order_Count END)
            END
UNION ALL
SELECT site, number, customernumber, orderdate
FROM ninety_day_cte