MySQL group by 为一列提供了错误的数据?
MySQL group by is giving wrong data for one column?
我正在尝试获取满足此查询的 WHERE 条件的所有行,并按 tickerSymbol 进行分组。每个 tickerSymbol 有多行,所以我只是想为每个 tickerSymbol 获取最后一行,这就是我按时间戳排序的原因。
这是table:
+----+--------------+---------+---------+---------+---------------------+
| id | tickerSymbol | session | quote | volume | timestamp |
+----+--------------+---------+---------+---------+---------------------+
| 6 | ADS | 2 | 226.81 | 2698 | 2017-10-06 09:38:36 |
| 15 | AFI | 2 | 16.09 | 5565 | 2017-10-06 09:38:52 |
| 96 | CNSL | 2 | 20.06 | 8396 | 2017-10-06 09:39:11 |
| 81 | DELT | 2 | 1.43 | 134867 | 2017-10-06 09:39:15 |
| 75 | FLXN | 2 | 27.7 | 125331 | 2017-10-06 09:38:58 |
| 27 | HXL | 2 | 58.69 | 3106 | 2017-10-06 09:39:02 |
| 45 | MMP | 2 | 70.5418 | 8069 | 2017-10-06 09:38:30 |
| 51 | NBIX | 2 | 62.43 | 21064 | 2017-10-06 09:39:15 |
| 39 | NFLX | 2 | 193.269 | 1394992 | 2017-10-06 09:39:16 |
| 42 | NLST | 2 | 0.7199 | 20011 | 2017-10-06 09:39:13 |
| 12 | NLST | 2 | 0.72 | 10010 | 2017-10-06 09:38:50 |
| 33 | NTES | 2 | 273.217 | 33064 | 2017-10-06 09:39:12 |
| 57 | NWS | 2 | 13.6677 | 8958 | 2017-10-06 09:39:14 |
| 21 | REGI | 2 | 12.0603 | 10068 | 2017-10-06 09:39:02 |
| 99 | RGEN | 2 | 38.23 | 14478 | 2017-10-06 09:39:02 |
| 93 | RNVA | 2 | 2.5105 | 40474 | 2017-10-06 09:38:53 |
| 72 | S | 2 | 7.51 | 833302 | 2017-10-06 09:39:13 |
| 84 | SBNY | 2 | 126.1 | 53815 | 2017-10-06 09:39:13 |
| 24 | SNDR | 2 | 24.82 | 1237 | 2017-10-06 09:39:04 |
| 66 | SO | 2 | 49.08 | 128862 | 2017-10-06 09:39:16 |
| 78 | SQ | 2 | 30.6947 | 342939 | 2017-10-06 09:39:15 |
| 9 | SWM | 2 | 41.2975 | 3071 | 2017-10-06 09:38:50 |
| 69 | SWN | 2 | 6.02 | 844406 | 2017-10-06 09:39:15 |
| 30 | TGNA | 2 | 13.49 | 23129 | 2017-10-06 09:39:13 |
| 36 | THC | 2 | 15.91 | 84785 | 2017-10-06 09:39:14 |
| 18 | TIER | 2 | 19.52 | 5234 | 2017-10-06 09:38:53 |
| 87 | UGLD | 2 | 10.3 | 91900 | 2017-10-06 09:39:13 |
| 90 | USB | 2 | 54.23 | 201985 | 2017-10-06 09:39:14 |
| 63 | REGI | 2 | 12.24 | 21527 | 2017-10-06 09:40:13 |
| 48 | RGEN | 2 | 38.33 | 28344 | 2017-10-06 09:40:12 |
| 54 | RNVA | 2 | 2.63 | 67512 | 2017-10-06 09:40:14 |
+----+--------------+---------+---------+---------+---------------------+
我正在使用以下查询。该查询的工作方式是 returns tickerSymbol 为 REGI、RGEN 或 RNVA 的 3 行,但引用列数据错误?
SELECT id, tickerSymbol, quote, MAX(timestamp) AS timestamp
FROM `dataPoints__quotes`
WHERE `tickerSymbol`='REGI' or `tickerSymbol`='RGEN' or `tickerSymbol`='RNVA'
GROUP BY `tickerSymbol`
ORDER BY `timestamp` DESC;
当我 运行 查询时,我得到:
+----+--------------+---------+---------------------+
| id | tickerSymbol | quote | timestamp |
+----+--------------+---------+---------------------+
| 93 | RNVA | 2.5105 | 2017-10-06 09:40:14 |
| 21 | REGI | 12.0603 | 2017-10-06 09:40:13 |
| 99 | RGEN | 38.23 | 2017-10-06 09:40:12 |
+----+--------------+---------+---------------------+
如我所愿,返回了3行,但是id和quote列的数据是错误的。
SQLFiddle
这是 table + 我在 SQLFiddle 上 运行 的数据,http://sqlfiddle.com/#!9/7aa8f9/2/0
CREATE TABLE IF NOT EXISTS `dataPoints__quotes`
(`id` int NOT NULL PRIMARY KEY
,`tickerSymbol` varchar(6) NOT NULL
,`session` int(11) NOT NULL
,`quote` float NOT NULL
,`volume` int(20) NOT NULL
,`timestamp` datetime NOT NULL
, INDEX(tickerSymbol)
);
INSERT INTO `dataPoints__quotes` (`id`, `tickerSymbol`, `session`, `quote`, `volume`, `timestamp`) VALUES
(6, 'ADS', 2, 226.81, 2698, '2017-10-06 09:38:36.180000'),
(15, 'AFI', 2, 16.09, 5565, '2017-10-06 09:38:52.054000'),
(96, 'CNSL', 2, 20.06, 8396, '2017-10-06 09:39:11.407000'),
(81, 'DELT', 2, 1.43, 134867, '2017-10-06 09:39:15.769000'),
(75, 'FLXN', 2, 27.7, 125331, '2017-10-06 09:38:58.666000'),
(27, 'HXL', 2, 58.69, 3106, '2017-10-06 09:39:02.898000'),
(45, 'MMP', 2, 70.5418, 8069, '2017-10-06 09:38:30.283000'),
(51, 'NBIX', 2, 62.43, 21064, '2017-10-06 09:39:15.688000'),
(39, 'NFLX', 2, 193.269, 1394992, '2017-10-06 09:39:16.410000'),
(42, 'NLST', 2, 0.7199, 20011, '2017-10-06 09:39:13.298000'),
(12, 'NLST', 2, 0.72, 10010, '2017-10-06 09:38:50.789000'),
(33, 'NTES', 2, 273.217, 33064, '2017-10-06 09:39:12.649000'),
(57, 'NWS', 2, 13.6677, 8958, '2017-10-06 09:39:14.187000'),
(21, 'REGI', 2, 12.0603, 10068, '2017-10-06 09:39:02.331000'),
(99, 'RGEN', 2, 38.23, 14478, '2017-10-06 09:39:02.986000'),
(93, 'RNVA', 2, 2.5105, 40474, '2017-10-06 09:38:53.685000'),
(72, 'S', 2, 7.51, 833302, '2017-10-06 09:39:13.726000'),
(84, 'SBNY', 2, 126.1, 53815, '2017-10-06 09:39:13.033000'),
(24, 'SNDR', 2, 24.82, 1237, '2017-10-06 09:39:04.891000'),
(66, 'SO', 2, 49.08, 128862, '2017-10-06 09:39:16.498000'),
(78, 'SQ', 2, 30.6947, 342939, '2017-10-06 09:39:15.179000'),
(9, 'SWM', 2, 41.2975, 3071, '2017-10-06 09:38:50.675000'),
(69, 'SWN', 2, 6.02, 844406, '2017-10-06 09:39:15.382000'),
(30, 'TGNA', 2, 13.49, 23129, '2017-10-06 09:39:13.274000'),
(36, 'THC', 2, 15.91, 84785, '2017-10-06 09:39:14.359000'),
(18, 'TIER', 2, 19.52, 5234, '2017-10-06 09:38:53.558000'),
(87, 'UGLD', 2, 10.3, 91900, '2017-10-06 09:39:13.731000'),
(90, 'USB', 2, 54.23, 201985, '2017-10-06 09:39:14.986000'),
(63, 'REGI', 2, 12.24, 21527, '2017-10-06 09:40:13.093000'),
(48, 'RGEN', 2, 38.33, 28344, '2017-10-06 09:40:12.472000'),
(54, 'RNVA', 2, 2.63, 67512, '2017-10-06 09:40:14.703000');
你会看到的returns:
id tickerSymbol quote timestamp
93 RNVA 2.5105 2017-10-06T09:40:14.703Z
21 REGI 12.0603 2017-10-06T09:40:13.093Z
99 RGEN 38.23 2017-10-06T09:40:12.472Z
查询在 id + quote 列中返回了错误的数据。它应该返回:
id tickerSymbol quote timestamp
54 RNVA 2.63 2017-10-06T09:40:14.703Z
63 REGI 12.24 2017-10-06T09:40:13.093Z
48 RGEN 38.33 2017-10-06T09:40:12.472Z
SELECT x.*
FROM datapoints__quotes x
JOIN
( SELECT tickersymbol
, MAX(timestamp) timestamp
FROM datapoints__quotes
WHERE tickersymbol IN('REGI','RGEN','RNVA')
GROUP
BY tickersymbol
) y
ON y.tickersymbol = x.tickersymbol
AND y.timestamp = x.timestamp;
+----+--------------+---------+-------+--------+---------------------+
| id | tickerSymbol | session | quote | volume | timestamp |
+----+--------------+---------+-------+--------+---------------------+
| 63 | REGI | 2 | 12.24 | 21527 | 2017-10-06 09:40:13 |
| 48 | RGEN | 2 | 38.33 | 28344 | 2017-10-06 09:40:12 |
| 54 | RNVA | 2 | 2.63 | 67512 | 2017-10-06 09:40:14 |
+----+--------------+---------+-------+--------+---------------------+
将您的 tickersymbol 索引更改为 (tickersymbol,timestamp)
我正在尝试获取满足此查询的 WHERE 条件的所有行,并按 tickerSymbol 进行分组。每个 tickerSymbol 有多行,所以我只是想为每个 tickerSymbol 获取最后一行,这就是我按时间戳排序的原因。
这是table:
+----+--------------+---------+---------+---------+---------------------+
| id | tickerSymbol | session | quote | volume | timestamp |
+----+--------------+---------+---------+---------+---------------------+
| 6 | ADS | 2 | 226.81 | 2698 | 2017-10-06 09:38:36 |
| 15 | AFI | 2 | 16.09 | 5565 | 2017-10-06 09:38:52 |
| 96 | CNSL | 2 | 20.06 | 8396 | 2017-10-06 09:39:11 |
| 81 | DELT | 2 | 1.43 | 134867 | 2017-10-06 09:39:15 |
| 75 | FLXN | 2 | 27.7 | 125331 | 2017-10-06 09:38:58 |
| 27 | HXL | 2 | 58.69 | 3106 | 2017-10-06 09:39:02 |
| 45 | MMP | 2 | 70.5418 | 8069 | 2017-10-06 09:38:30 |
| 51 | NBIX | 2 | 62.43 | 21064 | 2017-10-06 09:39:15 |
| 39 | NFLX | 2 | 193.269 | 1394992 | 2017-10-06 09:39:16 |
| 42 | NLST | 2 | 0.7199 | 20011 | 2017-10-06 09:39:13 |
| 12 | NLST | 2 | 0.72 | 10010 | 2017-10-06 09:38:50 |
| 33 | NTES | 2 | 273.217 | 33064 | 2017-10-06 09:39:12 |
| 57 | NWS | 2 | 13.6677 | 8958 | 2017-10-06 09:39:14 |
| 21 | REGI | 2 | 12.0603 | 10068 | 2017-10-06 09:39:02 |
| 99 | RGEN | 2 | 38.23 | 14478 | 2017-10-06 09:39:02 |
| 93 | RNVA | 2 | 2.5105 | 40474 | 2017-10-06 09:38:53 |
| 72 | S | 2 | 7.51 | 833302 | 2017-10-06 09:39:13 |
| 84 | SBNY | 2 | 126.1 | 53815 | 2017-10-06 09:39:13 |
| 24 | SNDR | 2 | 24.82 | 1237 | 2017-10-06 09:39:04 |
| 66 | SO | 2 | 49.08 | 128862 | 2017-10-06 09:39:16 |
| 78 | SQ | 2 | 30.6947 | 342939 | 2017-10-06 09:39:15 |
| 9 | SWM | 2 | 41.2975 | 3071 | 2017-10-06 09:38:50 |
| 69 | SWN | 2 | 6.02 | 844406 | 2017-10-06 09:39:15 |
| 30 | TGNA | 2 | 13.49 | 23129 | 2017-10-06 09:39:13 |
| 36 | THC | 2 | 15.91 | 84785 | 2017-10-06 09:39:14 |
| 18 | TIER | 2 | 19.52 | 5234 | 2017-10-06 09:38:53 |
| 87 | UGLD | 2 | 10.3 | 91900 | 2017-10-06 09:39:13 |
| 90 | USB | 2 | 54.23 | 201985 | 2017-10-06 09:39:14 |
| 63 | REGI | 2 | 12.24 | 21527 | 2017-10-06 09:40:13 |
| 48 | RGEN | 2 | 38.33 | 28344 | 2017-10-06 09:40:12 |
| 54 | RNVA | 2 | 2.63 | 67512 | 2017-10-06 09:40:14 |
+----+--------------+---------+---------+---------+---------------------+
我正在使用以下查询。该查询的工作方式是 returns tickerSymbol 为 REGI、RGEN 或 RNVA 的 3 行,但引用列数据错误?
SELECT id, tickerSymbol, quote, MAX(timestamp) AS timestamp
FROM `dataPoints__quotes`
WHERE `tickerSymbol`='REGI' or `tickerSymbol`='RGEN' or `tickerSymbol`='RNVA'
GROUP BY `tickerSymbol`
ORDER BY `timestamp` DESC;
当我 运行 查询时,我得到:
+----+--------------+---------+---------------------+
| id | tickerSymbol | quote | timestamp |
+----+--------------+---------+---------------------+
| 93 | RNVA | 2.5105 | 2017-10-06 09:40:14 |
| 21 | REGI | 12.0603 | 2017-10-06 09:40:13 |
| 99 | RGEN | 38.23 | 2017-10-06 09:40:12 |
+----+--------------+---------+---------------------+
如我所愿,返回了3行,但是id和quote列的数据是错误的。
SQLFiddle
这是 table + 我在 SQLFiddle 上 运行 的数据,http://sqlfiddle.com/#!9/7aa8f9/2/0
CREATE TABLE IF NOT EXISTS `dataPoints__quotes`
(`id` int NOT NULL PRIMARY KEY
,`tickerSymbol` varchar(6) NOT NULL
,`session` int(11) NOT NULL
,`quote` float NOT NULL
,`volume` int(20) NOT NULL
,`timestamp` datetime NOT NULL
, INDEX(tickerSymbol)
);
INSERT INTO `dataPoints__quotes` (`id`, `tickerSymbol`, `session`, `quote`, `volume`, `timestamp`) VALUES
(6, 'ADS', 2, 226.81, 2698, '2017-10-06 09:38:36.180000'),
(15, 'AFI', 2, 16.09, 5565, '2017-10-06 09:38:52.054000'),
(96, 'CNSL', 2, 20.06, 8396, '2017-10-06 09:39:11.407000'),
(81, 'DELT', 2, 1.43, 134867, '2017-10-06 09:39:15.769000'),
(75, 'FLXN', 2, 27.7, 125331, '2017-10-06 09:38:58.666000'),
(27, 'HXL', 2, 58.69, 3106, '2017-10-06 09:39:02.898000'),
(45, 'MMP', 2, 70.5418, 8069, '2017-10-06 09:38:30.283000'),
(51, 'NBIX', 2, 62.43, 21064, '2017-10-06 09:39:15.688000'),
(39, 'NFLX', 2, 193.269, 1394992, '2017-10-06 09:39:16.410000'),
(42, 'NLST', 2, 0.7199, 20011, '2017-10-06 09:39:13.298000'),
(12, 'NLST', 2, 0.72, 10010, '2017-10-06 09:38:50.789000'),
(33, 'NTES', 2, 273.217, 33064, '2017-10-06 09:39:12.649000'),
(57, 'NWS', 2, 13.6677, 8958, '2017-10-06 09:39:14.187000'),
(21, 'REGI', 2, 12.0603, 10068, '2017-10-06 09:39:02.331000'),
(99, 'RGEN', 2, 38.23, 14478, '2017-10-06 09:39:02.986000'),
(93, 'RNVA', 2, 2.5105, 40474, '2017-10-06 09:38:53.685000'),
(72, 'S', 2, 7.51, 833302, '2017-10-06 09:39:13.726000'),
(84, 'SBNY', 2, 126.1, 53815, '2017-10-06 09:39:13.033000'),
(24, 'SNDR', 2, 24.82, 1237, '2017-10-06 09:39:04.891000'),
(66, 'SO', 2, 49.08, 128862, '2017-10-06 09:39:16.498000'),
(78, 'SQ', 2, 30.6947, 342939, '2017-10-06 09:39:15.179000'),
(9, 'SWM', 2, 41.2975, 3071, '2017-10-06 09:38:50.675000'),
(69, 'SWN', 2, 6.02, 844406, '2017-10-06 09:39:15.382000'),
(30, 'TGNA', 2, 13.49, 23129, '2017-10-06 09:39:13.274000'),
(36, 'THC', 2, 15.91, 84785, '2017-10-06 09:39:14.359000'),
(18, 'TIER', 2, 19.52, 5234, '2017-10-06 09:38:53.558000'),
(87, 'UGLD', 2, 10.3, 91900, '2017-10-06 09:39:13.731000'),
(90, 'USB', 2, 54.23, 201985, '2017-10-06 09:39:14.986000'),
(63, 'REGI', 2, 12.24, 21527, '2017-10-06 09:40:13.093000'),
(48, 'RGEN', 2, 38.33, 28344, '2017-10-06 09:40:12.472000'),
(54, 'RNVA', 2, 2.63, 67512, '2017-10-06 09:40:14.703000');
你会看到的returns:
id tickerSymbol quote timestamp
93 RNVA 2.5105 2017-10-06T09:40:14.703Z
21 REGI 12.0603 2017-10-06T09:40:13.093Z
99 RGEN 38.23 2017-10-06T09:40:12.472Z
查询在 id + quote 列中返回了错误的数据。它应该返回:
id tickerSymbol quote timestamp
54 RNVA 2.63 2017-10-06T09:40:14.703Z
63 REGI 12.24 2017-10-06T09:40:13.093Z
48 RGEN 38.33 2017-10-06T09:40:12.472Z
SELECT x.*
FROM datapoints__quotes x
JOIN
( SELECT tickersymbol
, MAX(timestamp) timestamp
FROM datapoints__quotes
WHERE tickersymbol IN('REGI','RGEN','RNVA')
GROUP
BY tickersymbol
) y
ON y.tickersymbol = x.tickersymbol
AND y.timestamp = x.timestamp;
+----+--------------+---------+-------+--------+---------------------+
| id | tickerSymbol | session | quote | volume | timestamp |
+----+--------------+---------+-------+--------+---------------------+
| 63 | REGI | 2 | 12.24 | 21527 | 2017-10-06 09:40:13 |
| 48 | RGEN | 2 | 38.33 | 28344 | 2017-10-06 09:40:12 |
| 54 | RNVA | 2 | 2.63 | 67512 | 2017-10-06 09:40:14 |
+----+--------------+---------+-------+--------+---------------------+
将您的 tickersymbol 索引更改为 (tickersymbol,timestamp)