【发布时间】:2010-09-27 06:35:14
【问题描述】:
我正试图让这个查询工作。
查询是由“OMG Ponies”作为对fix mysql query to return random row within subgroup的回答编写的
下面的查询正确计算了日期的差异,但未能选择具有该差异最小值的 ROW(在 ID1-ID2 对内)。
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;
我正在使用查询在由 ID1-ID2 对定义的每个组中随机绘制一行。我希望 ID3 与 YEAR-MMDD 的日期差异最小(即 YEAR-MMDD 和 YEAR_ID3-MMDD_ID3 之间的绝对差异应该最小化)。如果有多个具有完全相同的日期,则查询应随机选择一个。
如果这是桌子……
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
那么查询应该返回
1,2,1991,0821,55 (OR 1,2,1991,0821,57 - ACCORDING TO THE RANDOM DRAW)
1,3,1990,0131,89
我正在这里粘贴一个 TEST TABLE 的 SQL DUMP...
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');
【问题讨论】:
-
@omg-ponies @OMG Ponies 我认为解决方案在于对具有相同差异但不被读取为第一行的行进行正确排名(即它们也应该获得 RANK =1!)。我试过 CASE WHEN @id1 = t.id1 AND @id2 = t.id2 AND @diff != diff THEN @rownum := @rownum + 1 ELSE @rownum := 1