기록

2014-11-03 2 views
0

의 일치 집합을 찾기 I가 ControlNo 기록의 각 세트에 들어
기록

RuleNo| MsgLineNo | RuleStartingPos | RuleMsg 
1  |  1  | 1    | Tiger1 Text 
2  |  1  | 1    | Tiger1 Text 
2  |  3  | 1    | Tiger1 Text3 


ContrlNo| LineNo  | Msg 
    1  |  1  | Tiger1 Text 
    1  |  2  | Tiger1 Text 
    1  |  3  | Tiger1 Text 
    1  |  4  | Tiger1 Text 
    2  |  1  | Tiger1 Text1 
    2  |  2  | Tiger1 Text2 
    2  |  3  | Tiger1 Text3 
    2  |  4  | Tiger1 Text4 
    3  |  1  | Horse 1 
    3  |  2  | Horse 2 
    3  |  3  | Horse 3 
    3  |  4  | Horse 4 

RuleTable 2008R2

MessageTable SQL Server에서 다음 표 MESSAGETABLE 나는 규칙 fr을 적용하고 싶다. RULETABLE을 옴으로써 어떤 문제가 있다면 RULENo를 나열하십시오.

규칙 테이블을 보면 규칙 2가 규칙 1을 중첩합니다. 그리고 각 제어 번호에 대해 가장 일치하는 규칙 번호를 얻는 것이 요구 사항입니다. 예상 된 결과이며,

ContrlNo | RuleNo 
1 | 1 
2 | 2 
3 | NULL 

감사합니다, 제이

+0

나는 당신의 예상 결과 뒤에 논리를 이해하지 않습니다. 더 철저하게 설명 할 수 있습니까? –

+0

각 ContrlNo에 대해 모든 레코드 (LineNo, Msg)를 가져와 RuleTable (MsgLineNo, RuleMsg)과 대조해야합니다. – Jay

+0

예를 들어 ContrlNo 1에 속한 레코드를 MessageTable에서 가져 와서 RuleTable과 비교하면 RuleNo 1은 100 %와 일치합니다. 그러나 RuleNo 2에는 두 가지 조건이 있으며 규칙 2의 두 번째 조건은 일치하지 않습니다. 결과는 ContrlNo | RuleNo (1 | 1). ContrlNo 2에 속한 레코드를 MessageTable에서 가져 와서 RuleTable과 비교하면 RuleNo 1은 100 %와 일치합니다. 하지만 RuleNo 2에는 두 가지 조건이 있으며 둘 다 100 %와 일치합니다. 최대 일치 규칙이 필요하므로이 경우 결과는 ContrlNo | RuleNo (2 | 2). – Jay

답변

0

LEFT JOIN를 사용하는 것처럼 나는 다음 나열된 결과를 가져올 것으로 예상 : 그것은 (가장 일치하는 선이 관련 규칙 제어 번호가 표시됩니다, 만약 귀하의 첫 번째 경우에서와 같이, 두 규칙은 동일한 수의 일치를가집니다. MatchPercent를 확인합니다).

SELECT MT.ContrlNo, r.RuleNo, r.MatchPercent 
FROM 
    MessageTable MT 
    LEFT JOIN 
    (
     SELECT 
     ContrlNo, 
     RuleNo, 
     MatchedRules/AvailableRules AS MatchPercent, 
     ROW_NUMBER() OVER (PARTITION BY ContrlNo ORDER BY MatchedRules DESC, MatchedRules/AvailableRules DESC) AS rn 
     FROM 
     (
      SELECT 
      ContrlNo, 
      R.RuleNo, 
      COUNT(*) as MatchedRules, 
      (SELECT COUNT(*) FROM RuleTable WHERE RuleTable.RuleNo = R.RuleNo) + 0.0 AS AvailableRules 
      FROM 
       MessageTable M 
       INNER JOIN 
       RuleTable R ON 
        M.[LineNo] = R.MsgLineNo AND 
        SUBSTRING(M.Msg,R.RuleStartingPos,LEN(R.RuleMsg)) LIKE '%' + R.RuleMsg + '%' 
      GROUP BY M.ContrlNo, R.RuleNo 
     ) q 
    ) r ON 
    MT.ContrlNo = r.ContrlNo AND 
    r.rn = 1 
GROUP BY MT.ContrlNo, r.RuleNo, r.MatchPercent 

SQL Fiddle

+0

정말 고마워요. .. 정말 그걸로 못 박았다. – Jay

0
총 일치 규칙과 제 2 서브 쿼리가 전체 규칙을 받고,이 두 가지 조건이 다음과 일치 할 때 우리는 RuleNo을 보여 다른 현명한 NULL을 받고있다

첫 번째 하위 쿼리 우리가

Select A.ContrlNo, ISNULL(T.RuleNo,0) as RuleNo FROM 
( select ContrlNo, COUNT(R.RuleNo) as MatchedRules 
    FROM Messages M 
    LEFT JOIN Rules R 
    on M.[LineNo] = R.MsgLineNo 
    and SUBSTRING(M.Msg,R.RuleStartingPos,LEN(R.RuleMsg)) = R.RuleMsg 
    AND M.ContrlNo = R.RuleNo 
GROUP BY M.ContrlNo) A 
LEFT JOIN ( 
    select COUNT(MsgLineNo) as TotalRules, RuleNo 
    from Rules R1 
    group by RuleNo) T 
    ON A.MatchedRules = T.TotalRules 
+0

선택 A.ContrlNo, T.RuleNo는 (M. [LINENO = R.MsgLineNo M.Msg 및 R = R에 RuleTable 가입 MessageTable M 왼쪽에서 MatchedRules 로 ContrlNo, COUNT (R.RuleNo)을 선택 M.ContrlNo BY .RuleMsg GROUP)을 LEFT가 조인 ( 선택 COUNT (MsgLineNo) TotalRules 같이, I가 필요로하는 메시지를 일치하는 RuleNo) T ON A.MatchedRules = T.TotalRules 의해 RuleTable R1 군으로부터 을 RuleNo SUBSTRING (M.Msg, R.RuleStartingPos, LEN (R.RuleMsg)) = R.RuleMsg 우리는 가장 일치하는 RuleNo를 ContrlNo와 비교할 필요가 있습니다. – Jay

+0

@ Jay, 조건에 조항을 추가하면 최대 일치 규칙 번호가 부여됩니다. – radar

+0

고마워 ....하지만 M.ContrlNo = R.RuleNo를 비교할 수는 없습니다 ... 그들은 완전히 다릅니다 – Jay