- UID
- 86208
- 阅读权限
- 100
- 帖子
- 10754
- 精华贴数
- 17
- 技术排名
- 67
- 技术积分
- 23241
- 社区排名
- 4236
- 社区积分
- 147
- 注册时间
- 2004-6-26
- 精华贴数
- 17
- 技术积分
- 23241
- 社区积分
- 147
- 注册时间
- 2004-6-26
- 论坛徽章:
- 71
|
发表于 2010-3-12 04:17:46
|显示全部楼层
谜题12 索赔状态
Leonard C. Medal在CompuServe上发表了下面的问题。病人对医疗机构提出法律索赔(claim),我们把它记录到Claims表中:
Claims
claim_id patient_name
======================
10 'Smith'
20 'Jones'
30 'Brown'
每一项索赔都有一个或多个被告(defendant),通常是医生,记录在'Defendants'表中:
Defendants
claim_id defendant_name
=======================
10 'Johnson'
10 'Meyer'
10 'Dow'
20 'Baker'
20 'Meyer'
30 'Johnson'
每个与索赔相关的被告都有法律事件(legal event)历史,当某项索赔的被告的索赔状态发生变化时,都会记录下来。
LegalEvents
claim_id defendant_name claim_status change_date
==================================================
10 'Johnson' 'AP' '1994-01-01'
10 'Johnson' 'OR' '1994-02-01'
10 'Johnson' 'SF' '1994-03-01'
10 'Johnson' 'CL' '1994-04-01'
10 'Meyer' 'AP' '1994-01-01'
10 'Meyer' 'OR' '1994-02-01'
10 'Meyer' 'SF' '1994-03-01'
10 'Dow' 'AP' '1994-01-01'
10 'Dow' 'OR' '1994-02-01'
20 'Meyer' 'AP' '1994-01-01'
20 'Meyer' 'OR' '1994-02-01'
20 'Baker' 'AP' '1994-01-01'
30 'Johnson' 'AP' '1994-01-01'
对于每个被告索赔状态的变化按照法律制订的已知顺序进行,如下面的Claim状态表所示:
ClaimStatusCodes
claim_status claim_status_desc claim_seq
==================================================
'AP' 'Awaiting review panel' 1
'OR' 'Panel opinion rendered' 2
'SF' 'Suit filed' 3
'CL' 'Closed' 4
被告(与某个索赔相关)的索赔状态是他或她最近的索赔状态,是具有最高索赔顺序号的索赔状态。由于某个法律原因,以日期排序的法律事件并不总是与按照索赔顺序号排序的法律事件相对应。
某个索赔的索赔状态是所有涉及索赔的被告中索赔状态最低的那个被告的状态。这样索赔状态是最大值中的最小值。对于样例数据,答案将是:
claim_id patient_name claim_status
==================================
10 'Smith' 'OR'
20 'Jones' 'AP'
30 'Brown' 'AP'
问题是找出每一项索赔的索赔状态并显示出来。
解惑 #1
Medal先生的答案是一条将描述直接转换为代码的SQL查询:
SELECT C1.claim_id, C1.patient_name, S1.claim_status
FROM Claims AS C1, ClaimStatusCodes AS S1
WHERE S1.claim_seq
IN (SELECT MIN(S2.claim_seq)
FROM ClaimStatusCodes AS S2
WHERE S2.claim_seq
IN (SELECT MAX(S3.claim_seq)
FROM LegalEvents AS E1, ClaimStatusCodes AS S3
WHERE E1.claim_status = S3.claim_status
AND E1.claim_id = C1.claim_id
GROUP BY E1.defendant_name));
解惑 #2
这将给出病人的所有索赔状态码:
SELECT E1.claim_id, C1.patient_name, E1.claim_status
FROM LegalEvents AS E1, Claims AS C1
WHERE E1.claim_id = C1.claim_id
GROUP BY E1.claim_id, C1.patient_name, E1.claim_status
解惑 #3
这个解答来自Francisco Moreno,它使用了SQL-92的JOIN句法,在设计上避免了子查询。
SELECT C1.claim_id, C1.patient_name,
CASE MIN(S1.claim_seq)
WHEN 2 THEN 'AP'
WHEN 3 THEN 'OR'
WHEN 4 THEN 'SF'
ELSE 'CL' END
FROM
((Claims AS C1
INNER JOIN
Defendants AS D1
ON C1.claim_id = D1.claim_id)
CROSS JOIN
ClaimStatusCodes AS S1)
LEFT OUTER JOIN
LegalEvents AS E1
ON C1.claim_id = E1.claim_id
AND D1.defendant_name = E1.defendant_name
AND S1.claim_status = E1.claim_status
WHERE E1.claim_id IS NULL
答案#3有点莫名其妙,估计又是页面不完整。
我的答案:
CREATE TABLE Claims (claim_id NUMBER, patient_name VARCHAR2(20));
INSERT INTO claims VALUES (10,'Smith');
INSERT INTO claims VALUES (20,'Jones');
INSERT INTO claims VALUES (30,'Brown');
CREATE TABLE Defendants (claim_id NUMBER, defendant_name VARCHAR2(20));
----- 此表在查询中并未用到。
INSERT INTO defendants VALUES(10,'Johnson' );
INSERT INTO defendants VALUES(10,'Meyer' );
INSERT INTO defendants VALUES(10,'Dow' );
INSERT INTO defendants VALUES(20,'Baker' );
INSERT INTO defendants VALUES(20,'Meyer' );
INSERT INTO defendants VALUES(30,'Johnson' );
CREATE TABLE LegalEvents (claim_id NUMBER, defendant_name VARCHAR2(20), claim_status VARCHAR2(2), change_date DATE);
INSERT INTO legalevents VALUES (10,'Johnson' ,'AP' , DATE '1994-01-01');
INSERT INTO legalevents VALUES (10,'Johnson' ,'OR' , DATE '1994-02-01');
INSERT INTO legalevents VALUES (10,'Johnson' ,'SF' , DATE '1994-03-01');
INSERT INTO legalevents VALUES (10,'Johnson' ,'CL' , DATE '1994-04-01');
INSERT INTO legalevents VALUES (10,'Meyer' ,'AP' , DATE '1994-01-01');
INSERT INTO legalevents VALUES (10,'Meyer' ,'OR' , DATE '1994-02-01');
INSERT INTO legalevents VALUES (10,'Meyer' ,'SF' , DATE '1994-03-01');
INSERT INTO legalevents VALUES (10,'Dow' ,'AP' , DATE '1994-01-01');
INSERT INTO legalevents VALUES (10,'Dow' ,'OR' , DATE '1994-02-01');
INSERT INTO legalevents VALUES (20,'Meyer' ,'AP' , DATE '1994-01-01');
INSERT INTO legalevents VALUES (20,'Meyer' ,'OR' , DATE '1994-02-01');
INSERT INTO legalevents VALUES (20,'Baker' ,'AP' , DATE '1994-01-01');
INSERT INTO legalevents VALUES (30,'Johnson' ,'AP' , DATE '1994-01-01');
CREATE TABLE ClaimStatusCodes (claim_status VARCHAR2(2), claim_status_desc VARCHAR2(40), claim_seq NUMBER);
INSERT INTO claimstatuscodes VALUES ('AP','Awaiting review panel' , 1);
INSERT INTO claimstatuscodes VALUES ('OR','Panel opinion rendered', 2);
INSERT INTO claimstatuscodes VALUES ('SF','Suit filed' , 3);
INSERT INTO claimstatuscodes VALUES ('CL','Closed' , 4);
SELECT t.claim_id,patient_name,claim_status
FROM (SELECT claim_id,MIN(claim_seq) AS min_claim_seq
FROM (SELECT claim_id,defendant_name,MAX(claim_seq) AS claim_seq
FROM LegalEvents l, ClaimStatusCodes cd
WHERE l.claim_status= cd.claim_status
GROUP BY claim_id,defendant_name
)
GROUP BY claim_id
) t
,Claims c
,ClaimStatusCodes cd
WHERE t.claim_id= c.claim_id
AND t.min_claim_seq = cd.claim_seq; |
|