首页 > 解决方案 > 使用 MySQL 获取具有多列的不同记录而不进行分组

问题描述

我有一个数据集

CREATE TABLE `dailytrades` (
  `dailytrades_date` date NOT NULL,
  `dailytrades_symbol` varchar(125) DEFAULT NULL,
  `dailytrades_qty` int(12) DEFAULT '0',
  `dailytrades_price` float(12,2) DEFAULT '0.00',
  `dailytrades_price_qualifier` varchar(5) DEFAULT NULL,
  `dailytrades_amt` float(12,2) DEFAULT '0.00',
  `dailytrades_amt_qualifier` varchar(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

具有以下行:-

+---------+------+------+------+-----+--------- +-----+
| 2019-12-24 | SLES | 250 | 20 | XCD | 5,000.00 | XCD |
+---------+------+------+------+-----+--------- +-----+
| 2020-01-09 | 博斯 | 50 | 6.75 | XCD | 337.5 | XCD |
+---------+------+------+------+-----+--------- +-----+
| 2020-01-13 | CWKN | 第443章 3.5 | XCD | 1,550.50 | XCD |
+---------+------+------+------+-----+--------- +-----+
| 2020-01-13 | CWKN | 117 | 3.5 | XCD | 409.5 | XCD |
+---------+------+------+------+-----+--------- +-----+
| 2020-01-13 | SKNB | 3114 | 3 | XCD | 9,342.00 | XCD |
+---------+------+------+------+-----+--------- +-----+
| 2020-01-13 | SKNB | 4861 | 3 | XCD | 14,583.00 | XCD |
+---------+------+------+------+-----+--------- +-----+

我正在尝试检索第二列中“最新”的不同值(数据集按第一列升序排序)以及其他列的值。

使用 GROUP BY 似乎会产生无法反映所需结果的意外结果,并且 DISTINCT 将尝试将自身应用于列出的所有列,这不是我想要的。

如何在检索所有列并根据升序默认为“最新”时获取第二列的不同值?

标签: mysqlgroup-bydistinct

解决方案


如果您的日期列也有时间部分,但您没有在这里分享,您可以尝试使用以下查询将符号与最大日期连接起来 -

SELECT `dailytrades_date`,
       `dailytrades_symbol`,
       `dailytrades_qty`,
       `dailytrades_price`,
       `dailytrades_price_qualifier`,
       `dailytrades_amt`,
       `dailytrades_amt_qualifier`
FROM `dailytrades` dt
INNER JOIN (SELECT MAX(`dailytrades_date`) `max_date`,
                   `dailytrades_symbol`
            FROM `dailytrades`
            GROUP BY `dailytrades_symbol`) mdt ON dt.`dailytrades_date` = mdt.`max_date`

由于您提到您没有任何时间部分,因此上述查询将无法完美运行。因此,为了使每一行在内部连接内联视图中都是唯一的,我dailytrades_qty也在选择列。

SELECT `dailytrades_date`,
       `dailytrades_symbol`,
       `dailytrades_qty`,
       `dailytrades_price`,
       `dailytrades_price_qualifier`,
       `dailytrades_amt`,
       `dailytrades_amt_qualifier`
FROM `dailytrades` dt
INNER JOIN (SELECT MAX(`dailytrades_date`) `max_date`,
                   `dailytrades_symbol`,
                   MAX(`dailytrades_qty`) `dailytrades_qty`
            FROM `dailytrades`
            GROUP BY `dailytrades_symbol`) mdt ON dt.`dailytrades_date` = mdt.`max_date`
                                               AND DT.`dailytrades_qty` = mdt.`dailytrades_qty`

推荐阅读