避免匹配记录中的循环

时间:2014-12-29 23:52:15

标签: sql sql-server sql-server-2008 tsql

我正在尝试减少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. 删除具有更大MatchID但具有相同BuyID
  2. 的记录
  3. 删除具有更大MatchID但具有相同SellID的记录
  4. 如果我这样做,步骤(1)删除记录2和4,而步骤(2)删除记录3.我能够重新排序SQL中的记录,因此这些对具有不同的MatchID,但我必然会遇到什么我可以在SQL Server中做。我试过以不同的方式排序比赛,但没有什么能给我一些我可以应用算法的东西。

    还有其他人有这样的问题吗?

2 个答案:

答案 0 :(得分:0)

使用window Function查找greater MatchIDSellId的{​​{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