SQL - выбрать только результаты, имеющие несколько записей - PullRequest
2 голосов
/ 15 июля 2011

это кажется простым, но я не могу понять, как это сделать или как правильно описать это в Google :(

Вкратце, есть таблица с:

PatientID | Date | Feature_of_Interest...

Я хочу представить некоторые результаты для пациентов с несколькими посещениями, когда они имеют интересующую особенность. Нет проблем с фильтрацией по интересующим вас функциям, но тогда я хочу, чтобы в моем результирующем запросе содержалось только несколько пациентов.

SELECT PatientID,Date,...
    FROM myTable
    WHERE Feature_Of_Interest is present
    AND (Filter out PatientID's that only appear once)

Так что - просто не знаю, как к этому подойти. Я пытался сделать:

WITH X AS (Above SELECT, Count(*),...,Group by PatientID)

Затем повторно запустил запрос, но он не сработал. Я могу опубликовать все это, если это необходимо, но у меня сложилось впечатление, что я подхожу к этому полностью назад, поэтому отложу пока.

Использование SQL Server 2008.

Ответы [ 5 ]

2 голосов
/ 15 июля 2011

Попробуйте это:

WITH qry AS
(
SELECT a.*,
COUNT(1) OVER(PARTITION BY PatientID) cnt
        FROM myTable  a
 WHERE Feature_Of_Interest = 'present '
)
SELECT *
  FROM qry
WHERE cnt >1
1 голос
/ 15 июля 2011

Вы хотите присоединиться к подзапросу

JOIN (
    SELECT 
        PatientID
    FROM myTable 
    WHERE Feature_Of_Interest is present 
    GROUP BY PatientID
    HAVING COUNT(*) > 1
) s ON myTable.PatientID = s.PatientID
1 голос
/ 15 июля 2011

Вы можете начать с подсчета запросов для посещений:

SELECT PatientID, COUNT(*) as numvisits FROM myTable
GROUP BY PatientID HAVING(numvisits > 1);

Затем вы можете основать дополнительные запросы на этом, присоединившись.

0 голосов
/ 15 июля 2011

Вы должны иметь возможность получить то, что вам нужно, используя оконную функцию , подобную этой:

WITH ctePatient AS (
  SELECT PatientID, Date, SUM(1) OVER (PARTITION BY PatientID) Cnt
  FROM tblPatient
  WHERE Feature_Of_Interest = 1
)
SELECT * 
  FROM ctePatient
  WHERE Cnt > 1
0 голосов
/ 15 июля 2011

Быстрый ответ, когда я ухожу в постель, поэтому его непроверенный код, но, короче, вы можете использовать подзапрос ..

SELECT PatientID,Date,...
    FROM myTable
    WHERE Feature_Of_Interest is present
    AND patientid in (select PatientID, count(patientid) as counter
    FROM myTable
    WHERE Feature_Of_Interest is present group by patientid having counter>1)

Я удивлен, что ваша попытка не сработала, звучит немногоон должен был быть, за исключением того, что вы не сказали, что считали> 1, следовательно, он, вероятно, просто вернул их все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...