SQL: Sélectionnez la valeur minimale d'une soustraction de deux colonnes et select également les nombres utilisés dans la soustraction min

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