J'ai deux colonnes, je veux sélectionner: le prix, le min abs. différence entre Price et Ssortingke, et le Ssortingke correspond au min abs. calcul de différence. Je suis nouveau à SQL, alors pardonnez-moi si c'est facile.
Price Ssortingke 30.8 29 30.8 30 30.8 31 30.2 29 30.2 30 30.2 31
La réponse que je veux get est:
Price Diff Ssortingke 30.8 .2 31 30.2 .2 30
Le code que j'ai jusqu'ici est:
Select min(price) as 'Price', min(abs(price - Ssortingke)) as 'Diff' from Table group by price
Je ne sais pas comment sélectionner correctement la frappe correspondante.
Merci de bien vouloir
Je vais utiliser la Window Function
pour le faire.
SELECT Price, Diff, Ssortingke FROM (SELECT *, Abs(price - Ssortingke) Diff, Row_number()OVER(partition BY price ORDER BY Abs(price - Ssortingke) )rn FROM Yourtable) a WHERE rn = 1
Ou s'il y a égalité dans la valeur min de Abs(price - Ssortingke)
par groupe de price
et si vous voulez toutes les lignes avec la même valeur min puis utilisez Dense_Rank
SELECT Price, Diff, Ssortingke FROM (SELECT *, Abs(price - Ssortingke) Diff, Dense_Rank()OVER(partition BY price ORDER BY Abs(price - Ssortingke) )rn FROM Yourtable) a WHERE rn = 1
La meilleure façon de le faire est à travers les fonctions de la window (en particulier RANK()
):
SELECT price, ssortingke, difference FROM ( SELECT price, ssortingke, ABS(price - ssortingke) AS difference , RANK() OVER ( ORDER BY ABS(price - ssortingke) ) AS rn FROM mytable ) x WHERE x.rn = 1;
Vous pouvez également utiliser DENSE_RANK()
(cela n'aura pas d'importance dans ce cas).