下面是一些ANSI-92 Query Mode語法SQL DDL和DML重建表和一個可能的解決方案:
CREATE TABLE TableA
(
ID INTEGER NOT NULL UNIQUE,
[Date] DATETIME NOT NULL,
Supplier_ID INTEGER NOT NULL
);
INSERT INTO TableA (ID, [Date], Supplier_ID)
SELECT DT1.ID, DT1.[Date], DT1.Supplier_ID
FROM (
SELECT DISTINCT 1 AS ID, '2009-10-22 00:00:00' AS [Date], 1 AS Supplier_ID FROM Customers
UNION ALL
SELECT DISTINCT 2, '2009-10-23 00:00:00', 1 FROM Customers
UNION ALL
SELECT DISTINCT 3, '2009-10-24 00:00:00', 2 FROM Customers
UNION ALL
SELECT DISTINCT 4, '2009-10-25 00:00:00', 2 FROM Customers
UNION ALL
SELECT DISTINCT 5, '2009-10-26 00:00:00', 1 FROM Customers
) AS DT1;
CREATE VIEW TableA_StartDates (Supplier_ID, start_date)
AS
SELECT T1.Supplier_ID, T1.[Date]
FROM TableA AS T1
WHERE NOT EXISTS (
SELECT *
FROM TableA AS T2
WHERE T2.Supplier_ID = T1.Supplier_ID
AND DATEADD('D', -1, T1.[Date]) = T2.[Date]
);
CREATE VIEW TableA_EndDates (Supplier_ID, end_date)
AS
SELECT T3.Supplier_ID, T3.[Date]
FROM TableA AS T3
WHERE NOT EXISTS (
SELECT *
FROM TableA AS T4
WHERE T4.Supplier_ID = T3.Supplier_ID
AND DATEADD('D', 1, T3.[Date]) = T4.[Date]
);
CREATE VIEW TableA_Periods (Supplier_ID, start_date, end_date)
AS
SELECT DISTINCT T5.Supplier_ID,
(
SELECT MAX(S1.start_date)
FROM TableA_StartDates AS S1
WHERE S1.Supplier_ID = T5.Supplier_ID
AND S1.start_date <= T5.[Date]
),
(
SELECT MIN(E1.end_date)
FROM TableA_EndDates AS E1
WHERE E1.Supplier_ID = T5.Supplier_ID
AND T5.[Date] <= E1.end_date
)
FROM TableA AS T5;
SELECT P1.Supplier_ID, P1.start_date, P1.end_date,
DATEDIFF('D', P1.start_date, P1.end_date) + 1 AS Days
FROM TableA_Periods AS P1;
你能否澄清你的例子? (1)是否有可能在同一日期擁有多個Supplier_ID,以及(2)如果Table_B中的數據是以日期訂單或Supplier_ID訂單編寫的,那麼這很重要嗎? – heferav 2009-10-20 12:41:37
澄清 無法在同一日期擁有多個Supplier_ID,並且無論數據插入到表B中的順序如何。 – Istari 2009-10-20 13:03:47
您需要添加更多信息。這些日子是連續的嗎?即將永遠是22,23,24,25?或者有可能會跳過?例如22,24,25 – 2009-10-20 21:33:17