【问题标题】:Getting multiple records on year wise逐年获得多条记录
【发布时间】:2009-10-08 09:16:01
【问题描述】:

我有一个包含约 5000 万条记录的患者信息表。我需要每年检查一些样品,这些样品可能按任何顺序排列。以下是数据库“20090722”、“20080817”、...“19980301”中可用的示例日期。我还有一个名为“PID”的主键列。我的要求是每年通过查询获得 2 或 3 个样本。

我尝试使用子查询每年获取 2 个样本,但没有成功。

本论坛中的任何人都对这种要求有想法,如果有,请帮助我。

伙计们,我在 sql server 中尝试了以下查询,它找到了。但我需要 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

【问题讨论】:

  • 听起来您在进行抽样查询。您是否关心每年返回哪些记录?它们需要是随机的、最大/最小/最好的,还是数据库首先遇到的任何东西?
  • 为什么这是一个社区维基?

标签: sql mysql subquery


【解决方案1】:

如果我理解正确,您可以这样做:

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

附言。我觉得你在 MySQL 数据库中有 5000 万条患者记录非常酷。 DS。

【讨论】:

  • 嗨乔纳斯,你几乎做到了。实际上我需要整行而不是 ID。您能否告诉我我需要在查询中进行哪些更改才能获得每年的“n”行。 - 谢谢
  • 我想不出一种方法可以在一个查询中完成。
【解决方案2】:
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)

【讨论】:

    猜你喜欢
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多