2009-12-20 66 views
0

感谢大家谁帮助我的最后一个问题。这是一个类似的问题,但现在我对自己想要的东西有了更好的了解。我再次使用MS SQL Server 2008,并试图找出超出我一周的SQL体验的查询。SQL Server 2008:基于多列过滤出重复行

现在我有以下简单的查询

SELECT pl.val, pl.txt_val, pl.id 
FROM dm.labs pl 
    WHERE pl.lab_nm = 'CK (CPK)' 
    AND pl.val < 999999; 
    AND pl.val IS NOT NULL 
ORDER BY pl.val; 

在这个表中,每一行对应于患者的实验室值的结果。问题在于,对于一​​些患者来说,有些行实际上是同一实验室阅读的多个副本。有一列pl.lab_filed_dts(日期时间数据类型)给出了实验室的日期。

我想要做的是:

编辑:如果两个(或更多)行具有相同的id,同样val,和相同的lab_filed_dts,无论其值的任何其他列,我希望仅从其中一行返回val,txt_valid(这与哪一个无关)。

编辑:如果两行具有相同的id,同样val,并在同一天部分(但不一定是时间)lab_filed_dtslab_filed_dts他们的一个时间部分是午夜,我要回val,txt_valid,其中lab_filed_dts时间不是午夜。

再次感谢大家的帮助!

+0

当你有两个(或更多)行时,你如何确定选择哪个txt_val? – lins314159 2009-12-20 23:37:37

+0

此表上有主键吗? – 2009-12-21 05:12:56

+0

Tom:有一个主键'lab_id'。 Lins:要么我不明白你的问题,要么我不明白SELECT是如何工作的。 我想说的是:如果两个(或更多)行具有相同的'id',相同的'val'和相同的'lab_filed_dts',而不管其他列中的值如何,我想返回' val','txt_val'和'id'只有一行(不重要)。这有帮助吗? – raoulcousins 2009-12-21 15:01:49

回答

1

如果我理解正确你的问题:

SELECT pl.val, pl.txt_val, pl.id 
FROM dm.labs pl 
    WHERE pl.lab_nm = 'CK (CPK)' 
    AND pl.val < 999999; 
    AND pl.val IS NOT NULL 
GROUP BY pl.val, pl.txt_val, pl.id, cast(lab_filed_dts as date) 
HAVING lab_filed_dts = max(lab_filed_dts) 
ORDER BY pl.val; 

/*改pl.vakpl.val因为你不能在select上一列顺序不,我认为这只是一个类型*/

+0

@jmoreno:我希望你不介意我编辑了你的帖子。如果您将一段代码的每一行缩进四个空格,您将得到很好的格式。 – jason 2009-12-20 23:50:11

+0

我不认为这会奏效。如果两个实验室有不同的txt_val值,即使重要的列是相同的,它们也会出现在结果中。 – 2009-12-21 05:10:40

+0

我觉得这个问题的另一个问题是,如果使用'HAVING lab_filed_dts = max(lab_filed_dts)',那么我将只为每个病人获得最新的CK实验室。患者随着时间的推移会有多个实验室完成,我希望看到所有实验室结果。我试图摆脱的是表格中的行,它们是单个实验室值的多个副本,也就是说,由于某种原因,患者的读数仅进行一次,但护士将结果输入数据记录两次。 – raoulcousins 2009-12-21 15:42:23