Comment pouvons-nous interroger un ensemble d'enregistrements pour obtenir des données pour des dates particulières où il peut y avoir des lacunes dans les dates.
Exemple de données
date | Price ------------------ 2018-03-31 | 115 2017-03-31 | 117 2016-12-31 | 143 2015-12-31 | 110
Données requises pour les dates: 2018-03-31, 2017-03-31, 2016-12-31, 2015-12-31
date | Price ------------------ 2018-03-31 | 115 2018-03-29 | 114 2018-03-28 | 113 ... 2017-03-29 | 117 2017-03-28 | 118 ... 2016-12-30 | 143 2016-12-29 | 140 ... 2015-12-31 | 110 2015-12-30 | 111
3 Réponses :
Il semble que vous ayez besoin du prix maximum pour l'année
select max(date), max(price) from my_table m inner join ( select max(date), year(date) my_year from my_table group by year(date) ) t on t.my_year = year(m.date) group by year(m.date)
Vous pouvez le faire avec une sous-requête corrélée. Ce qui suit renverra le prix pour la date exacte ou la date antérieure la plus proche:
SELECT dates.dt, (
SELECT price
FROM t
WHERE date <= dates.dt
ORDER BY date DESC
LIMIT 1
) AS price
FROM (
SELECT '2018-03-31' AS dt UNION ALL
SELECT '2017-03-31' UNION ALL
SELECT '2016-12-31' UNION ALL
SELECT '2015-12-31'
) AS dates
Ce sera assez lent par rapport à l'opérateur IN .
@iamrajshah comment le feriez-vous exactement avec l'opérateur IN ?
@SalmanA C'est très très intelligent et efficace. J'ai appris un nouveau hack à boucler en SQL. Merci pour cela.
Vous pouvez utiliser la fonction MySQL Last day et date_format pour obtenir le résultat souhaité. Consultez la requête: -
select last_day(a11.d_date), a11.price from test a11 join (select MAX(d_date) d_date, DATE_FORMAT(d_date, "%M %Y") from test group by DATE_FORMAT(d_date, "%M %Y") ) a12 on a11.d_date = a12.d_date
Cela ressemble à une combinaison de l'instruction GROUP BY pour obtenir le dernier prix et de l'opérateur IN pour sélectionner les dates spécifiques
Quelle est la forme des
Données requises pour les dates? Une table d'entrée (tableau de date), une chaîne de valeurs de date séparées?L'entrée @ PhamX.Bach est un tableau de dates.
Et quelle est la logique derrière la sortie souhaitée? Pour obtenir le prix maximum par rapport à la fin de mois spécifiques d'années spécifiques ou je l'ai manqué?
@codtex semble que si la date exacte n'est pas présente, revenir à la date antérieure la plus proche.
La sortie @SalmanA ressemble à ce que vous avez dit et je suppose que c'est la logique de l'OP. Votre solution à cet effet est très propre et belle.