2009-12-20 8 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 (тип данных datetime), дающий дату, когда была взята лаборатория.

То, что я хочу сделать, это:

Edit: если два (или более) строки имеют один и тот же id, тот же val и тот же lab_filed_dts, независимо от их значений в любой другой колонке, я хочу вернуть val, txt_val и id только из одного из строк (неважно, какой из них).

Edit: если две строки имеют одинаковую id, тот же val, и в тот же день часть (но не обязательно время) lab_filed_dts И времени часть lab_filed_dts для одного из них полночь, я хочу вернуться val, txt_val и id из ряда, чье время lab_filed_dts не является полночь.

Еще раз спасибо за помощь всем!

+0

Когда у вас есть две (или более) строки, как вы определяете, какой txt_val выбрать? – lins314159

+0

Есть ли первичный ключ в этой таблице? –

+0

Том: есть первичный ключ, 'lab_id'. Lins: либо я не понимаю ваш вопрос, либо я не понимаю, как работает SELECT. Я хотел сказать следующее: если две (или более) строки имеют одинаковые «id», те же «val» и те же «lab_filed_dts», независимо от их значений в любом другом столбце, я хочу вернуть ' val', 'txt_val' и' id' только из одной из строк (неважно, какой из них). Помогает ли это вообще? – raoulcousins

ответ

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.vak к pl.val, как вы не можете заказать на колонке не в select, и я предположил, что это был только тип */

+0

@jmoreno: Надеюсь, вы не против, что я отредактировал ваш пост. Если вы отделите каждую строку блока кода на четыре пробела, вы получите хорошее форматирование. – jason

+0

Я не думаю, что это сработает. Если две лаборатории имеют разные значения txt_val, они будут отображаться в результатах, даже если важные столбцы совпадают. –

+0

Я думаю, что еще одна проблема заключается в том, что если вы используете 'HAVING lab_filed_dts = max (lab_filed_dts)', тогда я получаю самую последнюю лабораторию CK для каждого пациента. Пациенты проводят несколько лабораторных исследований со временем, и я хочу увидеть все результаты лабораторных исследований. То, что я пытаюсь избавиться, это строки в таблице, которые представляют собой несколько копий одного лабораторного значения, то есть по какой-то причине показания для пациента были взяты один раз, но медсестра дважды вводила результаты в записи данных. – raoulcousins

Смежные вопросы