ruleId | claimsCount | systemType
__________________________________
1 | 1 | AAA
2 | 1 | AAA
3 | 4 | PPP
4 | 1 | AAA
我在ruleID:2包含2个条件的情况下遇到麻烦,并且必须匹配这两个条件,并且数量不高两次(如每个单独的条件匹配而言是数量的)。 任何规则都可以具有多个条件,但只能有一个条件。
这里是用于创建表和一些插入物的脚本。CREATE TABLE [dbo].[Claim](
[claimId] [int] NOT NULL,
[payerId] [nvarchar](50) NOT NULL,
[CreatedDate] [datetime] NULL,
[source] [nvarchar](3) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Claim] ADD PRIMARY KEY CLUSTERED
(
[claimId] ASC
)
GO
ALTER TABLE [dbo].[Claim] ADD DEFAULT (getdate()) FOR [CreatedDate]
GO
insert into claim values (101, '12345', GETDATE(),'AAA')
insert into claim values (102, '54321', '2025-03-01 18:22:27.687','AAA')
insert into claim values (103, '12345', GETDATE(),'PPP')
insert into claim values (104, '54321', GETDATE(),'PPP')
insert into claim values (105, '12345', '2025-03-01 18:22:27.687','PPP')
insert into claim values (106, '55555', '2025-02-01 18:22:27.687','PPP')
CREATE TABLE [dbo].[rules](
[ruleId] [int] NOT NULL,
[systemType] [nvarchar](5) NOT NULL,
[enabled] [varchar](1) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[rules] ADD PRIMARY KEY CLUSTERED
(
[ruleId] ASC
)
GO
insert into rules values (1, 'AAA', 'Y')
insert into rules values (2, 'AAA', 'Y')
insert into rules values (3, 'PPP', 'Y')
insert into rules values (4, 'AAA', 'Y')
insert into rules values (5, 'PPP', 'Y')
CREATE TABLE [dbo].[conditions](
[condId] [int] NOT NULL,
[ruleId] [int] NULL,
[conditionalType] [nvarchar](25) NOT NULL,
[conditionalOperator] [nvarchar](25) NOT NULL,
[conditionalValue] [nvarchar](25) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[conditions] ADD PRIMARY KEY CLUSTERED
(
[condId] ASC
)
GO
insert into conditions values (1, 1, 'payerId', 'equals', '12345')
insert into conditions values (2, 2, 'payerId', 'equals', '54321')
insert into conditions values (3, 2, 'createdDate', 'greater_than_or_equal', '2025-03-01')
insert into conditions values (4, 3, 'payerId', 'equals', '54321')
insert into conditions values (5, 4, 'createdDate', 'equals', '2025-03-06')
insert into conditions values (6, 5, 'createdDate', 'equals', '2025-02-01')
select
rul.ruleId,
count(clm.claimId) as 'claimCount',
--clm.claimId,
rul.systemType
from
claim clm
inner join rules rul on clm.source = rul.systemType
inner join conditions con on rul.ruleId = con.ruleId AND (
(con.conditionalType = 'payerId' AND con.conditionalValue = clm.payerId) OR
(
(con.conditionalType = 'createdDate' AND con.conditionalOperator = 'equals' AND CONVERT(VARCHAR(10), con.conditionalValue, 101) = CONVERT(VARCHAR(10), clm.CreatedDate, 101)) OR
(con.conditionalType = 'createdDate' AND con.conditionalOperator = 'greater_than_or_equal' AND CONVERT(VARCHAR(10), con.conditionalValue, 101) >= CONVERT(VARCHAR(10), clm.CreatedDate, 101)) OR
(con.conditionalType = 'createdDate' AND con.conditionalOperator = 'less_than_or_equal' AND CONVERT(VARCHAR(10), con.conditionalValue, 101) <= CONVERT(VARCHAR(10), clm.CreatedDate, 101))
)
)
where
rul.enabled = 'Y'
group by rul.ruleId, rul.systemType--, clm.claimId
order by rul.ruleId;
我感谢任何指导。 我很难将自己的头缠绕着。
我们需要确保索赔仅将规则符合规则,如果该规则满足所有规则的条件
。在您的ruleId = 2
tho,才能算作匹配项。我们还想确保在每个条件下都不会对其进行两次计数,但是每次匹配。
我们将:
join
claims
conditions
。
WITH condition_checks AS (
SELECT
c.claimId,
r.ruleId,
r.systemType,
cond.condId,
cond.conditionalType,
cond.conditionalOperator,
cond.conditionalValue,
CASE
WHEN cond.conditionalType = 'payerId' AND cond.conditionalOperator = 'equals' AND c.payerId = cond.conditionalValue THEN 1
WHEN cond.conditionalType = 'createdDate' AND cond.conditionalOperator = 'equals' AND CONVERT(date, c.CreatedDate) = CONVERT(date, cond.conditionalValue) THEN 1
WHEN cond.conditionalType = 'createdDate' AND cond.conditionalOperator = 'greater_than_or_equal' AND CONVERT(date, c.CreatedDate) >= CONVERT(date, cond.conditionalValue) THEN 1
ELSE 0
END AS is_condition_met
FROM
claim c
JOIN
rules r ON c.source = r.systemType AND r.enabled = 'Y'
JOIN
conditions cond ON r.ruleId = cond.ruleId
),
matched_claims AS (
SELECT
claimId,
ruleId,
systemType,
COUNT(*) AS total_conditions,
SUM(is_condition_met) AS conditions_met
FROM
condition_checks
GROUP BY
claimId,
ruleId,
systemType
)
SELECT
ruleId,
COUNT(DISTINCT claimId) AS claimsCount,
systemType
FROM
matched_claims
WHERE
total_conditions = conditions_met
GROUP BY
ruleId,
systemType
ORDER BY
ruleId