2009-10-08 4 views
1

환자 기록 테이블이 약 5 천만 건입니다. 나는 어떤 순서로 할지도 모른다 각 년을위한 몇몇 견본을 검사 할 필요가있다. 다음은 데이터베이스 "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

샘플링 쿼리를 한 것처럼 보입니다. 매년 어떤 기록이 반환되는지 신경 쓰시겠습니까? 무작위, 가장 큰 것/가장 작은 것/가장 좋을 것인가 또는 DB가 처음부터 오는 것이 무엇이든간에 그것들은 필요합니까? – searlea

+0

왜이 커뮤니티 위키입니까? –

답변

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); 

편집

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. 나는 당신이 MySQL 데이터베이스에 5 천만 개의 환자 레코드를 가지고 있다는 것을 매우 멋있다고 느낍니다. DS.

+0

안녕하세요 Jonas, 거의 했어요. 사실 ID가 아닌 전체 행이 필요합니다. 매년 'n'행을 얻기 위해 쿼리에서 변경해야 할 내용을 알려주십시오. - 고맙습니다. –

+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)