2009-10-08 1 views
1

У меня есть таблица информации о пациентах с ~ 50 миллионами записей. Мне нужно проверить некоторые образцы за каждый год, которые могут быть в любом порядке. Вот пример даты, доступной в базе данных «20090722», «20080817», ... «19980301». Также у меня есть столбец первичного ключа, называемый «PID». Мое требование состоит в том, чтобы получить 2 или 3 выборки за каждый год с запросом.Получение нескольких записей за год по разумным причинам

Я попытался получить 2 образца за каждый год, используя подзапросы, я не преуспел.

Любой, кто в этом форуме, имеет идею по этому требованию, если да, пожалуйста, помогите мне.

Ребята я пробовал следующий запрос в sql-сервере и работал с ним. Но мне нужен запрос в MYSQL. Пожалуйста, помогите мне.

select pid,studydate 
    FROM (SELECT ROW_NUMBER() OVER (PARTITION BY studydate ORDER BY pid DESC) AS  
     'RowNumber', pid,studydate 
     FROM patient 
) pt 
    WHERE RowNumber <= 2 
+0

Каков ваш запрос? –

+0

Похоже, что после запроса выборки. Вам не нравится, какие записи возвращаются за каждый год? Должны ли они быть случайными, самыми большими/наименьшими/лучшими, или чем-то, с чем сталкивается БД? – searlea

+0

Почему это сообщество wiki? –

ответ

0

Если я вас правильно понял вы могли бы сделать что-то вроде этого:

select year(datecolumn) as Year, 
    (select id from PatiendRecords pr2 where pr2.id>=min(pr.id)+rand()*max(pr.id) LIMIT 1), 
    (select id from PatiendRecords pr2 where pr2.id>=min(pr.id)+rand()*max(pr.id) LIMIT 1), 
    (select id from PatiendRecords pr2 where pr2.id>=min(pr.id)+rand()*max(pr.id) LIMIT 1) 
from PatiendRecords pr 
group by year(datecolumn); 

EDIT

delimiter // 

CREATE PROCEDURE RandomRecordsPerYear(n INT) 
BEGIN 
    CREATE TEMPORARY TABLE lookup 
    (id INT) ENGINE = MEMORY; 

    SET @x = 0; 
    REPEAT SET @x = @x + 1; 
    INSERT INTO lookup (id) 
    SELECT (SELECT id FROM PatientRecords pr WHERE pr2.id>=min(pr.id)+rand()*max(pr.id) LIMIT 1) AS Id FROM PatientRecords pr GROUP BY year(created_at); 
    UNTIL @x >= n END REPEAT; 

    SELECT * FROM PatientRecords s JOIN lookup l ON l.id=pr.id; 
    DROP TABLE lookup; 
END 
// 

call RandomRecordsPerYear(3)// 

PS. Мне очень приятно, что у вас 50 миллионов записей пациентов в базе данных MySQL. DS.

+0

Hi Jonas, Вы почти сделали это. На самом деле мне нужна целая строка, а не идентификаторы. Не могли бы вы рассказать мне изменения, которые мне нужно внести в запрос, чтобы получить «n» строк каждого года. - Спасибо – 2009-10-09 05:29:36

+0

Я не мог придумать способ сделать это в одном запросе. –

0
SELECT md.* 
FROM (
     SELECT @r := @r + 1 AS y 
     FROM (
       @r := 0 
       ) vars 
     CROSS JOIN 
       mytable 
     LIMIT 200 
     ) years 
JOIN mytable md 
ON  md.datecol >= CAST('1900-01-01' AS DATETIME) + INTERVAL y YEARS 
     AND md.datecol < CAST('1900-01-01' AS DATETIME) + INTERVAL y + 1 YEARS 
     AND md.id <= 
     COALESCE(
     (
     SELECT id 
     FROM mytable mi 
     WHERE mi.datecol >= CAST('1900-01-01' AS DATETIME) + INTERVAL y YEARS 
       AND mi.datecol < CAST('1900-01-01' AS DATETIME) + INTERVAL y + 1 YEARS 
     ORDER BY 
       id 
     LIMIT 2 
     ), 0xFFFFFFFF)