Sql 查找匹配的记录集
我在SQL Server 2008R2上有以下表格 消息表 规则表 对于MESSAGETABLE中的每组ControlNo记录,我希望应用RULETABLE中的规则,并列出RULENo(如果有) 如果您看到RuleTable,则规则2与规则1重叠。要求是为每个控制编号获得最匹配的RuleNo。预期结果是,Sql 查找匹配的记录集,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我在SQL Server 2008R2上有以下表格 消息表 规则表 对于MESSAGETABLE中的每组ControlNo记录,我希望应用RULETABLE中的规则,并列出RULENo(如果有) 如果您看到RuleTable,则规则2与规则1重叠。要求是为每个控制编号获得最匹配的RuleNo。预期结果是, ContrlNo | RuleNo 1 | 1 2 | 2 3 | NULL 谢谢, Jay第一个子查询得到的是完全匹配的规则,第二个子查询得到的是完全匹配的规则
ContrlNo | RuleNo
1 | 1
2 | 2
3 | NULL
谢谢,
Jay第一个子查询得到的是完全匹配的规则,第二个子查询得到的是完全匹配的规则,当这两个条件匹配时,我们将显示规则No other wise NULL,因为我们使用的是左连接
我相信以下内容将检索列出的结果:它将显示一个控制编号和关联规则,该规则具有最多匹配行。如果与第一种情况一样,两个规则的匹配数相等,它将检查匹配百分比
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
我不明白你预期结果背后的逻辑。您能更详细地解释一下吗?我们需要获取每个ContrlNo的所有记录SLINENO,Msg,并将其与RuleTableMsgLineNo,RuleMsg进行匹配。例如,如果我们从MessageTable中获取属于ContrlNo 1的记录,并将其与RuleTable进行匹配,则RuleNo 1将100%匹配。但是规则2有两个条件,规则2的第二个条件不匹配。结果是,控制规则1。如果我们从MessageTable中获取属于ContrlNo 2的记录并将其与RuleTable匹配,则RuleNo 1将100%匹配。但是规则2有两个条件,它们都是100%匹配的。因为我们需要最大匹配规则,所以在本例中,结果是ContrlNo | RuleNo2 | 2。@Jay,我给出的查询是否适用于您?从Select ContrlNo中选择A.ContrlNo,T.RuleNo,从MessageTable M中选择COUNTR.RuleNo作为匹配规则左连接M上的规则表R。[LineNo]=R.MsgLineNo和M.Msg=R.RuleMsg GROUP BY M.ContrlNo A LEFT JOIN选择COUNTMsgLineNo作为TotalRules,RuleNo从RuleTable R1 GROUP BY RuleNo T按A.MatchedRules=T.TotalRules匹配消息我需要执行以下操作,SUBSTRINGM.Msg,R.RuleStartingPos,LENR.RuleMsg=R.RuleMsg我们需要为每个控件获取最匹配的RuleNo。@Jay,在子句中添加了该条件,它确实给出了最大匹配的规则no。谢谢。。。。但是我们不能比较M.ContrlNo=R.RuleNo。。。他们完全不同
ContrlNo | RuleNo
1 | 1
2 | 2
3 | 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
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