Sql 避免匹配记录中的循环

Sql 避免匹配记录中的循环,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我试图减少SQL Server中的循环,但我有点不知所措。我需要根据给定的标准配对买卖。根据这一标准,一组买入可以与一组卖出相匹配。并非每次买入都能与每次卖出相匹配,反之亦然,但一次买入可以与多次卖出相匹配,反之亦然。我可以很容易地得到一个所有可能匹配的临时表,但困难的部分是只使用一次就可以将一次买入配对到一次卖出 虽然在某种程度上循环似乎是不可避免的,但由于记录量太大,我宁愿不使用游标。我想一次按一组标准来做,例如,为每一个项目抓取第一对。我试着使用一个临时表T,列出可能的匹配项,将它们缩小到

我试图减少SQL Server中的循环,但我有点不知所措。我需要根据给定的标准配对买卖。根据这一标准,一组买入可以与一组卖出相匹配。并非每次买入都能与每次卖出相匹配,反之亦然,但一次买入可以与多次卖出相匹配,反之亦然。我可以很容易地得到一个所有可能匹配的临时表,但困难的部分是只使用一次就可以将一次买入配对到一次卖出

虽然在某种程度上循环似乎是不可避免的,但由于记录量太大,我宁愿不使用游标。我想一次按一组标准来做,例如,为每一个项目抓取第一对。我试着使用一个临时表T,列出可能的匹配项,将它们缩小到成对,然后重复。至少,我循环了100次而不是100万次

下面是临时表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,所以我需要扔掉重复的匹配,而不要在一个循环中进行太多的传递!谢谢