sql - 修复 mysql 查询以返回子组内的随机行

标签 sql mysql

我正在使用以下查询从具有最小时间距离(YEAR 和 MMDD 字段)的记录的每个 ID1-ID2 对的子集中随机抽取一行。

CREATE TABLE temp4 AS 
     SELECT * 
      FROM temp3 
  GROUP BY ID1, ID2 
  ORDER BY DATEDIFF( CONCAT(YEAR,'-',LEFT(MMDD,2),'-',RIGHT(MMDD,2)), CONCAT(ID3_YEAR,'-',LEFT(ID3_MMDD,2),'-',RIGHT(ID3_MMDD,2)) ) ASC, RAND() 
     LIMIT 0, 1;

根据我之前在此处发布的问题,表格是这样的

ID1 ID2 YEAR  MMDD  ID3 YEAR_ID3  MMDD_ID3
---------------------------------------
1   2   1991  0821  55  1991      0822    
1   2   1991  0821  57  1991      0822    
1   2   1991  0821  88  1992      0101
1   3   1990  0131  89  2000      0202    
1   3   1990  0131  89  2001      0102

对于每个 ID1-ID2 对,我需要选择 ID3

THE MINIMUM DISTANCE IN TERMS OF TIME (both YEAR field and MMDD field, i.e. I need to compare YEAR and MMDD vs. YEAR_ID3 and MMDD_ID3)

IF MORE THAN ONE ID3 SATISFIES THE MINIMUM REQUIREMENT ABOVE (i.e. they both have the same YEAR_ID3 and MMDD_ID3), I NEED TO SELECT ONE RANDOMLY.

在上面的例子中,查询应该返回

1,2,1991,0821,55 (OR 1,2,1991,0821,57 - ACCORDING TO THE RANDOM DRAW)

1,3,1990,0131,89

我在上面粘贴的那个只返回一行...:(

在 OMG 发布的评论部分下面有一个很好的解决方案......但它消失了?!?!?

我在这里粘贴

DROP TABLE IF EXISTS temp4;
CREATE TABLE temp4 AS
SELECT x.id1,
       x.id2,
       x.YEAR,
       x.MMDD,
       x.id3,
       x.id3_YEAR,
       x.id3_MMDD
 FROM (SELECT t.*,
               ABS(DATEDIFF(CONCAT(CAST(t.id3_YEAR AS CHAR(4)),'-', LEFT(t.id3_MMDD,2),'-',RIGHT(t.id3_MMDD,2)),
                        CONCAT(CAST(t.YEAR AS CHAR(4)),'-', LEFT(t.MMDD,2),'-',RIGHT(t.MMDD,2))))  AS diff,
               CASE 
                 WHEN @id1 = t.id1 AND @id2 = t.id2 THEN @rownum := @rownum + 1
                 ELSE @rownum := 1
               END AS rk,
               @id1 := t.id1,
               @id2 := t.id2
          FROM temp3 t
          JOIN (SELECT @rownum := 0, @id1  := 0, @id2 := 0) r
      ORDER BY t.id1, t.id2, diff, RAND()) x
 WHERE x.rk = 1;

我在这里粘贴测试表的 SQL 转储

DROP TABLE IF EXISTS `temp3`;
CREATE TABLE IF NOT EXISTS `temp3` (
  `id1` char(7) NOT NULL,
  `id2` char(7) NOT NULL,
  `YEAR` year(4) NOT NULL,
  `MMDD` char(4) NOT NULL,
  `id3` char(7) NOT NULL,
  `id3_YEAR` year(4) NOT NULL,
  `id3_MMDD` char(4) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `temp3` VALUES('1', '2', 1992, '0107', '55', 1991, '0528');
INSERT INTO `temp3` VALUES('1', '2', 1992, '0107', '57', 1991, '0701');
INSERT INTO `temp3` VALUES('1', '3', 1992, '0107', '88', 2000, '0101');
INSERT INTO `temp3` VALUES('1', '3', 1992, '0107', '44', 2000, '0101');

最佳答案

从查询中提取随机记录的常用方法是

SELECT [] FROM table ORDER BY RAND() LIMIT []

关于sql - 修复 mysql 查询以返回子组内的随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3796228/

相关文章:

html - 如何在laravel中实现html表与mysql数据的排序功能?

php - 在 while 循环中使用 GROUP_CONCAT 在一行中输出同一用户的多个数据库条目

mysql - 使用 count 函数对两个表中的记录进行计数,即使计数为零也返回相同的记录

mysql - 确定 MySQL 行的存储要求

MySQL逗号分隔值到多行

php - 混淆(如果有的话)$_SESSION 和 $_COOKIE 变量?

java - Java Spring 中不同的 MySQL 引擎

mysql - 如何从mysql事务中获取存储的变量值

sql - 您可以在不删除服务器的情况下在 MS SQL server Management Studio 中查看链接服务器属性吗?

安装 SQL Server Management Studio 后,SQL Server 服务在服务列表中不可用