SQL语句中如何选择最早的记录

control1981 2015-06-15 05:56:45
各位SQL大咖,小弟不是计算机专业出身的,而是从事卫生管理。‘
最近需要研究一个医学数据库,但是不知道如何用SQL语言从数据库中调阅出自己需要的数据。
所以请各位大咖指点下:
这个数据库下面包含了若干个子库,我需要其中两个子库链接。
第一个子库是化验,内容大致如下:

病人ID 检查项目 检查结果 检查时间
1 WBC 1 2015.12.3
1 WBC 2 2015.12.4
1 RBC 3 2015.12.6
2 WBC 4 2013.12.2
2 WBC 5 2013.11.7
2 RBC 6 2013.5.6
2 PLT 7 2012.3.6
3 WBC 8 2014.5.6
3 RBC 9 2013.3.5
3 RBC 10 2012.3.6
3 PLT 11 2013.3.8
这里说明一下,病人ID是病人的唯一标识。一个病人可能做很多次检查,每次检查的项目和时间都不一定相同,上面的WBC、RBC和PLT就是检查项目。现在我就想要病人每个项目上第一次检查的结果。比如1号病人,做了两次WBC,我只需要其中的第一次,也就是2015.12.3做的那一次。

第二个表格是病人的一般状况。
大致就是
病人ID 性别 年龄 糖尿病
1 男 23 有
2 女 43 无
3 男 22 有

我现在想把这两个表格连接起来,得到这样一个表格:

病人ID 性别 年龄 糖尿病 WBC RBC PLT
1 男 23 有 1 4 7
2 女 43 无 2 5 8
3 男 22 有 3 6 9

看了一下SQL的书,感觉对我这个非计算机专业的人来说有点难,所以请求大家帮忙支招。
该用什么样的SQL语句。

如果有站友愿意帮助我从数据库中提取出数据,或者帮助我编号程序,我愿意支付一定的劳动报酬。

有意者可PM我。

...全文
224 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
control1981 2015-06-16
  • 打赏
  • 举报
回复
大侠,你太强了! 太感谢了。 你写下的语句我得消化消化,不懂的再来问问您哈~~~~ 另,那个检测时间其实后面有小时、分和秒,比如:2012.12.13.15:33:25 如果这样,上述程序是否需要改一下。 再次感谢!
hery2002 2015-06-15
  • 打赏
  • 举报
回复
DECLARE @t_TB TABLE ([UserID] NVARCHAR(10),[Item] NVARCHAR(10),[Result] NVARCHAR(10),[Date] DATETIME);
INSERT INTO @t_TB VALUES
('1','WBC','1','2015.12.3'),
('1','WBC','2','2015.12.4'),
('1','RBC','3','2015.12.6'),
('2','WBC','4','2013.12.2'),
('2','WBC','5','2013.11.7'),
('2','RBC','6','2013.5.6'),
('2','PLT','7','2012.3.6'),
('3','WBC','8','2014.5.6'),
('3','RBC','9','2013.3.5'),
('3','RBC','10','2012.3.6'),
('3','PLT','11','2013.3.8');

DECLARE @t_TB2 TABLE ([UserID] NVARCHAR(10),[Sex] NVARCHAR(10),[Age] INT,[sick] NVARCHAR(10));
INSERT INTO @t_TB2 VALUES 
('1','M','23','Y'),
('2','F','43','N'),
('3','M','22','Y');

;WITH CTE
AS
(SELECT USERID,ITEM,RESULT
FROM @t_TB T
WHERE NOT EXISTS( SELECT 1 FROM @t_TB WHERE  USERID = T.USERID   AND ITEM = T.ITEM AND [DATE] <T.[DATE])
)

SELECT T2.UserID,T2.Sex,T2.Age,T2.sick,MAX(CASE WHEN T1.ITEM ='WBC' THEN T1.RESULT END) AS WBC,
MAX(CASE WHEN T1.ITEM ='RBC' THEN T1.RESULT END) AS RBC,
MAX(CASE WHEN T1.ITEM ='PLT' THEN T1.RESULT END) AS PLT FROM @t_TB2 T2 
INNER JOIN CTE T1   ON T1.USERID = T2.USERID 
GROUP BY   T2.UserID,T2.Sex,T2.Age,T2.sick
/*
UserID     Sex        Age         sick       WBC        RBC        PLT
---------- ---------- ----------- ---------- ---------- ---------- ----------
1          M          23          Y          1          3          NULL
2          F          43          N          5          6          7
3          M          22          Y          8          10         11
*/

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧