Получить отдельные записи с несколькими столбцами без группировки, используя MySQL - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть набор данных

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 | BOSV | 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 будет пытаться применить себя ко всем перечисленным столбцам, а это не то, что я хочу.

Как получить отдельные значения 2-го столбца при извлечении всех столбцов и установлении значений по умолчанию на «последний» в порядке возрастания?

1 Ответ

1 голос
/ 28 февраля 2020

Если в вашем столбце даты также есть часть времени, но вы не указали ее здесь, вы можете попробовать выполнить запрос ниже, который объединяет символ с максимальными датами -

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`
...