[英]Preferred Sequence Algorithm in T-SQL
說明
我正在使用SQL Server 2012.我需要編寫算法來根據設置時間決定生產產品的順序。
我的意思是:例如我們需要生產4種產品:ABCD
我有一個矩陣(表格Changeover
)填充每個產品的設置時間,如:
Xasis Yasis Time
--------------------
A B 10
A C 15
A D 5
B A 5
B C 20
B D 10
C A 10
C B 15
C D 5
D A 0
D B 5
D C 25
規則:
如果我們首先生產產品A,並且在我們生產產品B之后,將會有10分鍾的設置時間......
如果我們首先生產產品A,並且在我們生產產品C之后,將有15分鍾的設置時間......
如果我們首先生產產品B,並且在我們生產產品A之后,將有5分鍾的設置時間......
等等....
期望的輸出:
目標是使產品的生產順序最短。 因此,使用此示例數據它將是:
5 0 10 (Total 15 minutes)
C ----> D ----> A ----> B
此輸出不正確:
15 10 0 (Total 25 minutes)
C ----> B ----> D ----> A
我有另一個表Products
的數據是這樣的:
Product Rank
A 1
B 2
C 3
D 4
表中的排名值Products
說明了生產產品的順序,因此這個樣本序列將是:
10 20 5 (Total 35 minutes)
A ----> B ----> C ----> D
所以這是不正確的,因為總設置時間是35分鍾。
期望的結果:我需要算法來更新Products
表,如下所示:
Product Rank
A 3
B 4
C 1
D 2
5 0 10 (Total 15 minutes)
C ----> D ----> A ----> B
你有什么想法可以做到這一點嗎? (真實有超過140種產品)
樣本數據:
CREATE TABLE #Attr
(
Id NVARCHAR(20),
[Rank] INT
)
INSERT INTO #Attr (Id, [Rank])
VALUES ('A',1), ('B',2), ('C',3), ('D',4)
CREATE TABLE #Change
(
Xasis NVARCHAR(20),
Yasis NVARCHAR(20),
[Time] INT
)
INSERT INTO #Change (Xasis, Yasis, [Time])
VALUES ('A','B',10), ('A','C',15), ('A','D',5),
('B','A',5), ('B','C',20), ('B','D',10),
('C','A',10), ('C','B',15), ('C','D',5),
('D','A',0), ('D','B',5), ('D','C',25);
我嘗試過的:我可以在以下內容中獲得每組最低的設置時間:
WITH filtered AS
(
SELECT
*,
ROW_NUMBER() OVER(PARTITION BY Xasis ORDER BY [Time]) AS RankPerGroup
FROM #Change AS c
)
SELECT
*, ROW_NUMBER() OVER(ORDER BY [Time]) AS [Rank]
FROM filtered f1
WHERE RankPerGroup = 1
我得到以下輸出:
Xasis Yasis Time RankPerGroup Rank
D A 0 1 1
A D 5 1 2
B A 5 1 3
C D 5 1 4
這是不正確的,因為我無法按順序生成:
0 D already produced, so that's incorrect
D ----> A --X--> D ---
希望我解釋清楚,如果您有任何問題或誤解我,請問我,我會提供更多信息。
如果您有四種產品,您可以這樣做:
select co1.Xasis as x1, co2.Xasis as x2, co3.Xasis as x3, co3.Yasis as x4,
(co1.time + co2.time + co3.time) as total_time
from changeover co1 join
changeover co2
on co1.Yasis = co2.Xasis join
changeover co3
on co2.Yasis = co3.Xasis
where col2.Xasis not in (col1.Yasis) and
col3.Xasis not in (col1.Yasis, col2.Yasis) and
col3.Yasis not in (col1.Xasis, col2.Xasis, col3.Xasis)
order by total_time desc;
這是在SQL中實現強力算法。 通常,這是使用單個查詢可以做到的最佳選擇。
join
保證序列是可能的。 not in
保證鏈中的新鏈接不會返回到以前的產品。
如果您有更多產品,則可以自定義查詢以獲得您擁有的產品數量。 或者,您可以設置遞歸子查詢。 但是,我會小心的。 當你獲得10種產品時,這可能會變得非常昂貴。
對於一個大問題,您可能希望使用圖形數據庫或高級分析軟件來查看其他類型的優化算法(可能是近似的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.