Справка по SQL-запросу - условие применяется только для самой новой записи - PullRequest
0 голосов
/ 31 августа 2011

Ниже приведена упрощенная версия Таблицы.Мой запрос состоит в том, чтобы выбрать все идентификаторы пациента, где последний результат X теста превышает 10.Результат должен быть только ID пациента 1 и 3.

В этой таблице более 30 тысяч записей.Я не мог найти лучший способ сделать это.

PatientId   Test    Result  Date
1           X       11      2011/05/11
1           X        5      2005/05/11
1           Y        5      2011/05/11
2           X        5      2011/05/11
2           X       12      2005/05/11
2           Z       12      2011/05/11
3           X       16      2011/05/11
4           X       9       2005/05/11

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

Я бы сделал что-то вроде этого:

SELECT a.PatientId
FROM
    some_table AS a
    INNER JOIN (
        SELECT PatientId, MAX(Date) AS Date
        FROM some_table
        WHERE Test = 'X'
        GROUP BY PatientId
    ) AS lr ON a.PatientId = lr.PatientId AND a.Date = lr.Date
WHERE a.Test = 'X' AND a.Result > 10
1 голос
/ 31 августа 2011

Возможно, вы могли бы использовать CTE, но я не знаю их наизусть, поэтому я попробую традиционное внутреннее соединение.Отказ от ответственности: - полностью из памяти, поэтому не может работать.

SELECT a.* 
FROM Tests a 
INNER JOIN (SELECT patient_id, test, max(date) as maxdate 
              FROM Tests 
             WHERE test = 'X' 
          GROUP BY patient_id, test) b
        ON a.patient_id = b.patient_id
       AND a.test = b.test
       AND a.date = b.maxdate
     WHERE a.result > 10

Надеюсь, это поможет.

1 голос
/ 31 августа 2011

Если я правильно понял (с данными, которые вы нам предоставили, запрос должен вернуть PatientId 2 и 3), примерно так должно работать:

WITH TT (PatientId, Test, Result, N) AS (
    SELECT PatientId,
           Test,
           Result
           ROW_NUMBER() OVER(PARTITION BY PatientId ORDER BY Date ASC)
      FROM some_table
     WHERE Test = 'X')
    SELECT PatientId
      FROM TT
     WHERE Result > 10
       AND N = 1;

без CTE:

SELECT PatientId
  FROM (SELECT PatientId,
               Test,
               Result
               ROW_NUMBER() OVER(PARTITION BY PatientId ORDER BY Date ASC) N
          FROM some_table
         WHERE Test = 'X') tmp
 WHERE Result > 10
   AND N = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...