Получение нескольких записей на год - PullRequest
1 голос
/ 08 октября 2009

У меня есть таблица информации о пациентах с ~ 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

Ответы [ 2 ]

0 голосов
/ 08 октября 2009
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)
0 голосов
/ 08 октября 2009

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

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.

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