I created this table for the test data (I recommend adding a primary key):
CREATE TABLE OrderItem (
OrderId INT NOT NULL,
TableId INT NOT NULL,
TimeTaken INT NOT NULL,
ItemName VARCHAR(20) NOT NULL,
OrderTime DATETIME NOT NULL
);
GO
INSERT INTO OrderItem VALUES (1, 2, 10, 'Pizza', '2013-06-20 05:30:33.343 PM');
INSERT INTO OrderItem VALUES (1, 2, 10, 'Burger', '2013-06-20 05:35:33.343 PM');
INSERT INTO OrderItem VALUES (1, 2, 10, 'Burger', '2013-06-20 05:38:33.343 PM');
INSERT INTO OrderItem VALUES (1, 2, 20, 'Dhosa', '2013-06-20 06:03:33.343 PM');
INSERT INTO OrderItem VALUES (1, 2, 10, 'Juize', '2013-06-20 06:03:33.343 PM');
GO
Your question was a bit unclear - but I think it is based on separating the order-items that don't overlap. To work out the separated orders I did this:
SELECT DISTINCT OrderId, TableId, OrderTime AS EarliestOrderTime
FROM OrderItem AS T1
WHERE NOT EXISTS (
SELECT 1 FROM OrderItem AS T2
WHERE T2.OrderId = T1.OrderId
AND T2.TableId = T1.TableId
AND T2.OrderTime < T1.OrderTime
AND DateAdd(mi, T2.TimeTaken, T2.OrderTime) >= T1.OrderTime)
This gives 2 rows - one for
17:30:33.343
and the other for
18:03:33.343
.
I converted that SQL-Select into a CTE so that I can reference it twice so that I can join it to the associated order lines:
WITH SeparatedOrders_CTE (OrderId, TableId, EarliestOrderTime)
AS
(
SELECT DISTINCT OrderId, TableId, OrderTime AS EarliestOrderTime
FROM OrderItem AS T1
WHERE NOT EXISTS (
SELECT 1 FROM OrderItem AS T2
WHERE T2.OrderId = T1.OrderId
AND T2.TableId = T1.TableId
AND T2.OrderTime < T1.OrderTime
AND DateAdd(mi, T2.TimeTaken, T2.OrderTime) >= T1.OrderTime)
)
SELECT SO1.OrderId, SO1.TableId, SO1.EarliestOrderTime,
SUM(T1.TimeTaken) AS TotalTimeTaken,
DateDiff(mi, SO1.EarliestOrderTime, MAX(T1.OrderTime)) AS WaitingTime,
(SUM(T1.TimeTaken) - DateDiff(mi, SO1.EarliestOrderTime, MAX(T1.OrderTime))) AS TimeToDelivery
FROM SeparatedOrders_CTE as SO1
INNER JOIN OrderItem AS T1
ON T1.OrderId = SO1.OrderId
AND T1.TableId = SO1.TableId
AND T1.OrderTime >= SO1.EarliestOrderTime
WHERE NOT EXISTS (
SELECT 1 FROM SeparatedOrders_CTE AS SO2
WHERE SO2.OrderId = SO1.OrderId
AND SO2.TableId = SO1.TableId
AND SO2.EarliestOrderTime > SO1.EarliestOrderTime
AND SO2.EarliestOrderTime <= T1.OrderTime)
GROUP BY SO1.OrderId, SO1.TableId, SO1.EarliestOrderTime
ORDER BY SO1.OrderId, SO1.TableId, SO1.EarliestOrderTime
Which gives:
OrderId TableId EarliestOrderTime TotalTimeTaken WaitingTime TimeToDelivery
-------- -------- ----------------------- -------------- ----------- --------------
1 2 2013-06-20 17:30:33.343 30 8 22
1 2 2013-06-20 18:03:33.343 30 0 30
Your question does say what would happen if customers move between tables during the meal. I would expect that
TableId
should in-fact be moved to a parent table (keyed by
OrderId
).
Alternative methods might be to use SQL Server's
windowing functions[
^] or a cursor.
I hope that helps.
Regards
Andy