2014-12-29 5 views
-1

SQL Server에서 루프를 줄이려고하고 있는데, 어처구니가 없습니다. 구매 기준을 쌍으로 맞추고 주어진 기준에 따라 판매해야합니다. 그 기준으로, 구매 그룹은 판매 그룹과 일치 할 수 있습니다. 모든 구매가 매매와 매치 할 수있는 것은 아니지만 매매가 하나 이상일 경우 매수가 매도 할 수 있습니다. 모든 가능한 경기의 임시 테이블을 쉽게 얻을 수 있지만 단 한 번의 구매를 한 번만 한 번씩 한 번만 수행하면됩니다.일치하는 레코드에서 루프 피하기

어떤 식 으로든 반복하는 것은 피할 수없는 것처럼 보일지라도 레코드의 양 때문에 커서를 사용하지 않을 것입니다. 한 번에 한 세트의 기준을 찾아보고 싶습니다 (예 : 각 항목의 첫 번째 쌍을 가져옴). 가능한 표의 임시 테이블 #T를 사용하려고합니다. 쌍으로 범위를 좁히고 반복합니다. 최소한 나는 100 만회 대신 100 회 반복한다. 나는 계속 중 MatchIDs 1, 4, 2, 3. 나는 그것을 좁힐이 알고리즘을 사용하려고 한 수 위의 경우

MatchID BuyID SellID 
     1  91  59 
     2  91  60 
     3  97  59 
     4  97  60 

: 여기

는 임시 테이블 #T의 조각입니다

  1. A A 큰 MatchID에 기록하지만, 같은 SellID을 삭제하려면 더 큰 MatchID에 기록하지만, 같은 BuyID
  2. 삭제

이 경우 단계 (1)은 레코드 2와 4를 삭제하고 단계 (2)는 레코드 3을 삭제합니다. SQL의 레코드를 재정렬하여 쌍이 다른 MatchID를 가질 수는 있지만, SQL Server에서 할 수 있습니다. 나는 여러 가지 방법으로 성냥을 주문하려했지만, 알고리즘을 적용 할 수있는 어떤 것도주지 못했다.

다른 누구에게도 이와 같은 문제가 있었습니까?

+0

이 경우 일치해야 할 내용 : (1,2,3), (2,2,4), (3,3,5)? –

+0

데이터가 실제로 얻는 것만 큼 복잡합니까? 또는 BuyID = 98에 대해 5 개의'BuyID' 행이 있고 BuyID = 99에 대해 3 개의'BuyID' 행만있을 수 있습니까? 당신은 그들 모두가 서로 일치하지 않을 것이라고 말합니다. 그래서 98의'BuyID'도 59와 60의'SellID' 값과 만 일치 할 수 있습니까? 이 경우 59 및 60은 이미 91 및 97의 BuyID 값에 사용되었으므로 어떻게해야합니까? –

+0

데이터가 실제로 더 복잡해 지지만 질문이 너무 혼란스러워지는 것을 원치 않습니다. 구매 ID 91은 SellID 59 또는 60과 일치 할 수 있고 BuyID 97과 동일 할 수 있다고 가정하십시오. 그러나 한 번에 하나의 BuyID 만 일치시킬 수 있으므로 너무 많지 않고 중복 된 항목을 버려야합니다. 루프를 통과합니다. –

답변

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 
+0

그랬어! 감사! –

0

SellIdBuyID에 대해 greater MatchID을 찾으려면 window Function을 사용하십시오. 그런 다음 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) 
관련 문제