Obter o mais recente registro de data no mysql

0

Pergunta

Eu tenho uma tabela em que eu armazenar um código, a um preço e uma data.

Código do tipo varchar, o preço é do tipo float (sim, eu sei que é melhor para armazená-lo como Duplo), data tipo data

create table prices (
 code varchar(15), 
 price float(5),
 date date
)

assim,

insert into prices (code,price,date) values
('ADV000001','2.1','2021-02-03'),
('ADV000001','0.3','2021-11-22'),
('ADV000001','20.0','2021-11-23'),
('ADV000001','31.4','2017-01-11'),
('ADV000001','99.99','2012-12-09'),
('ADV000123','31.4','2017-04-21'),
('ADV000123','0.4','2016-12-02'),
('ADV000123','31','2012-11-06'),
('ADV000991','3','2000-01-15'),
('ADV000991','1.4','2004-01-13'),
('ADV000991','0.9','2011-01-30'),
('ADV000991','12','2017-01-23'),
('ADV000991','854.82','2004-04-30'),
('ADV000991','231.11','2009-04-15'),
('ADV000991','242.66','2021-04-09'),
('ADV000912','111.1','2021-01-11'),
('ADV000912','1.4','2020-01-11'),
('ADV031242','75.48','2019-03-11'),
('ADV031242','231.42','2019-07-11'),
('ADV011912','1324.11','1994-11-11'),
('ADV000112','685.04','1993-06-11'),
('ADV000777','757.54','2001-06-11'),
('ADV000777','221.74','2002-09-11'),
('ADV000777','1352.12','2012-04-11'),
('ADV000215','856.81','2011-12-11'),
('ADV000202','511.99','2011-11-11')

Eu tento fazer essa escolha, mas ele não funciona muito bem, traz a data correta, no entanto, ele traz-me a qualquer preço, não é o correto!!!!

SELECT 
code, price, date 
FROM 
prices 
WHERE 
date = (SELECT MAX(date) FROM prices) 

o resultado:

code       price    date
ADV000001   0.3    2021-11-23

Idealmente, ele deve mostrar cada código com seus respectivos preços e a data mais recente.

code           price    date
ADV000001      20       2021-11-23
ADV000123      31.4     2017-04-21
ADV000991    242.66     2021-04-09
...          ...          ... 

Qualquer idéias? talvez um sub-consultar? um grupo de frases que não funciona!

O MYSQL MAX() função não parecem funcionar, não é grupo de códigos e só me traz um registro. Aqui está o link onde você pode rapidamente pedir a sua consulta, eu agradeceria. dbfiddle.reino unido

mysql
2021-11-24 02:59:24
3

Melhor resposta

1

Aqui estão as suas consultas, mas em primeiro lugar!!! Nunca é uma boa idéia usar palavras-chave SQL como nomes de coluna. Se você fizer isso você deve citar tzhe fieldname com aspas invertidas.

obter um resultado

SELECT 
CODE, price, DATE 
FROM 
prices 
WHERE 
`date`= (SELECT MAX(DATE) FROM prices);

obter todos os resultados

SELECT p1.`code`, p1.`maxdate`, p2.`price` FROM (
    SELECT `CODE`, MAX(`DATE`) AS maxdate FROM prices GROUP BY `CODE`) AS p1
LEFT JOIN prices p2 ON p1.`code`= p2.`code`AND p2.`date` = p1.maxdate
ORDER BY p1.`code`;

exemplo

MariaDB [order]> SELECT 
    -> CODE, price, DATE 
    -> FROM 
    -> prices 
    -> WHERE 
    -> `date`= (SELECT MAX(DATE) FROM prices);
+-----------+-------+------------+
| CODE      | price | DATE       |
+-----------+-------+------------+
| ADV000001 |    20 | 2021-11-23 |
+-----------+-------+------------+
1 row in set (0.06 sec)


MariaDB [order]> SELECT p1.`code`, p1.`maxdate`, p2.`price` FROM (
    -> SELECT `CODE`, MAX(`DATE`) AS maxdate FROM prices GROUP BY `CODE`) AS p1
    -> LEFT JOIN prices p2 ON p1.`code`= p2.`code`AND p2.`date` = p1.maxdate
    -> ORDER BY p1.`code`;
+-----------+------------+---------+
| code      | maxdate    | price   |
+-----------+------------+---------+
| ADV000001 | 2021-11-23 |      20 |
| ADV000112 | 1993-06-11 |  685.04 |
| ADV000123 | 2017-04-21 |    31.4 |
| ADV000202 | 2011-11-11 |  511.99 |
| ADV000215 | 2011-12-11 |  856.81 |
| ADV000777 | 2012-04-11 | 1352.12 |
| ADV000912 | 2021-01-11 |   111.1 |
| ADV000991 | 2021-04-09 |  242.66 |
| ADV011912 | 1994-11-11 | 1324.11 |
| ADV031242 | 2019-07-11 |  231.42 |
+-----------+------------+---------+
10 rows in set (0.01 sec)

MariaDB [order]> 
2021-11-24 03:35:13
0

Fazer sua consulta Select "Ordem" em ordem decrescente. Eu estou falando sobre a consulta de selecção de obter a data mais recente em seu banco de dados.

2021-11-24 03:24:19
0

Se você usar where `date` = (SELECT MAX(`date`) FROM `prices`) em seguida, ele vai ser seleccione apenas uma mais recente (MAX) a partir da tabela para utilizar esta condição de data. Resultado está mostrando apenas 1 registo.

Referem-se a partir desta pergunta

SELECT 
    `prices`.*
FROM 
    `prices`
INNER JOIN (
    SELECT MAX(`date`) AS `maxdate`, `price`, `code`
    FROM `prices`
    GROUP BY `code`
) AS `prices2` 
    ON `prices`.`date` = `prices2`.`maxdate`
ORDER BY `date` DESC

Resultados:

código preço data
ADV000001 20 2021-11-23
ADV000991 242.66 2021-04-09
ADV000912 111.1 2021-01-11
ADV031242 231.42 2019-07-11
ADV000123 31.4 2017-04-21
ADV000777 1352.12 2012-04-11
ADV000215 856.81 2011-12-11
ADV000202 511.99 2011-11-11
ADV011912 1324.11 1994-11-11
ADV000112 685.04 1993-06-11
2021-11-24 03:39:18

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................