我正在尝试减少SQL Server中的循环,我有点难过。我需要按照给定的标准配对购买和销售。对于该标准,一组购买可以与一组销售匹配。并非每次购买都能与每次销售相匹配(反之亦然),但单次购买可以与多次销售相匹配(反之亦然)。我可以很容易地获得所有可能匹配的临时表,但困难的部分是将单次购买仅与每次购买配对。
虽然以某种方式循环似乎是不可避免的,但由于记录量的原因,我宁愿不使用游标。我想一次按一套标准(例如,抓住每个项目的第一对)。我正在尝试使用临时表#T的可能匹配,将它们缩小到成对,并重复。至少,我循环100次而不是100万次。
这是一个临时表#T:
的片段MatchID BuyID SellID
1 91 59
2 91 60
3 97 59
4 97 60
对于上述情况,我可以保留MatchIDs 1和4或2和3.我曾尝试使用此算法缩小范围:
如果我这样做,步骤(1)删除记录2和4,而步骤(2)删除记录3.我能够重新排序SQL中的记录,因此这些对具有不同的MatchID,但我必然会遇到什么我可以在SQL Server中做。我试过以不同的方式排序比赛,但没有什么能给我一些我可以应用算法的东西。
还有其他人有这样的问题吗?
答案 0 :(得分:0)
使用window Function
查找greater MatchID
和SellId
的{{1}}。然后使用BuyID
删除记录
CTE
答案 1 :(得分:0)
艰难的一个!我觉得这很有效。
CREATE TABLE #t (MatchID INT, BuyID INT, SellID INT)
INSERT #t
SELECT 1, 91, 59 UNION ALL
SELECT 2, 91, 60 UNION ALL
SELECT 3, 97, 59 UNION ALL
SELECT 4, 97, 60
DELETE
#t
WHERE
MatchID IN
(
SELECT DISTINCT
t1.MatchID
FROM
(
SELECT
MatchID,
ROW_NUMBER() OVER (PARTITION BY SellID ORDER BY SellID) AS Row
FROM
#t
) AS t1
CROSS JOIN
(
SELECT
MatchID,
ROW_NUMBER() OVER (PARTITION BY BuyID ORDER BY BuyID) AS Row
FROM
#t
) AS t2
WHERE
t1.Row <> 1 AND
t2.Row <> 1
)
SELECT * FROM #t