Sql 避免匹配记录中的循环
我试图减少SQL Server中的循环,但我有点不知所措。我需要根据给定的标准配对买卖。根据这一标准,一组买入可以与一组卖出相匹配。并非每次买入都能与每次卖出相匹配,反之亦然,但一次买入可以与多次卖出相匹配,反之亦然。我可以很容易地得到一个所有可能匹配的临时表,但困难的部分是只使用一次就可以将一次买入配对到一次卖出 虽然在某种程度上循环似乎是不可避免的,但由于记录量太大,我宁愿不使用游标。我想一次按一组标准来做,例如,为每一个项目抓取第一对。我试着使用一个临时表T,列出可能的匹配项,将它们缩小到成对,然后重复。至少,我循环了100次而不是100万次 下面是临时表T的一个片段:Sql 避免匹配记录中的循环,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我试图减少SQL Server中的循环,但我有点不知所措。我需要根据给定的标准配对买卖。根据这一标准,一组买入可以与一组卖出相匹配。并非每次买入都能与每次卖出相匹配,反之亦然,但一次买入可以与多次卖出相匹配,反之亦然。我可以很容易地得到一个所有可能匹配的临时表,但困难的部分是只使用一次就可以将一次买入配对到一次卖出 虽然在某种程度上循环似乎是不可避免的,但由于记录量太大,我宁愿不使用游标。我想一次按一组标准来做,例如,为每一个项目抓取第一对。我试着使用一个临时表T,列出可能的匹配项,将它们缩小到
MatchID BuyID SellID
1 91 59
2 91 60
3 97 59
4 97 60
对于以上内容,我可以保留matchID 1和4或2和3。我曾尝试使用此算法缩小范围:
删除MatchID较大但BuyID相同的记录
删除MatchID较大但SellID相同的记录
如果我这样做,步骤1将删除记录2和4,而步骤2将删除记录3。我可以在SQL中对记录进行重新排序,以便这些记录对具有不同的MatchID,但我必须遵守在SQL Server中可以执行的操作。我尝试过以不同的方式对匹配进行排序,但没有什么能让我应用算法
还有其他人遇到过这样的问题吗?使用窗口函数查找SellId和BuyID的更大匹配ID。然后使用CTE删除记录
CREATE TABLE #test
(
MatchID INT,
BuyID INT,
SellID INT
)
INSERT #test
VALUES ( 1,91,59),
( 2,91,60),
( 3,97,59),
( 4,97,60);
WITH cte
AS (SELECT Row_number()OVER(partition BY buyid ORDER BY matchid DESC)B_rn,
Row_number()OVER(partition BY sellid ORDER BY matchid DESC)S_rn,
*
FROM #test)
DELETE FROM cte
WHERE 1 IN ( b_rn, s_rn )
真厉害!我认为这是可行的
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
在这种情况下应该匹配什么:1,2,3,2,2,4,3,3,5?这真的像数据那样复杂吗?或者,对于BuyID=98,可能有5个BuyID行,而对于BuyID=99,可能只有3个BuyID行?你说它们不会相互匹配,那么BuyID为98也可能只匹配SellID值59和60吗?在这个例子中,59和60已经被用于91和97的BuyID值,那么怎么办呢?数据确实变得更复杂了,但我不想让问题变得太混乱。假设BuyID 91可以与SelLee 59或60匹配,并且对于BuiID 97也是相同的。然而,我一次只能匹配一个BuyID,所以我需要扔掉重复的匹配,而不要在一个循环中进行太多的传递!谢谢