2 votes

Recherche de données à un endroit donné à l'aide d'une requête SQL

J'ai une structure de tableau comme suit

idx   p_id    location_id  

1     CTX      A1
2     CTX      A2
3     ABC      A3
4     ABC      A1

idx est un numéro d'incrémentation automatique qui indique la dernière position. (dans le cas du produit CTX, il a été transféré de A1 à A2)

Maintenant, ce que je veux trouver, c'est n'importe quel produit dans l'emplacement A1. Je ne devrais trouver que le produit ABC, puisque le produit CTX a été déplacé de A1 à A2, il n'est plus dans A1.

Existe-t-il un moyen simple d'effectuer une requête SQL ?

3voto

Conrad Frix Points 34272

En supposant que vous souhaitiez trouver toutes les lignes où le dx max pour un p_id donné se trouve à l'emplacement 'A1'

SELECT t.* 
FROM   table1 t 
       INNER JOIN (SELECT p_id, 
                          Max(dx) dx 
                   FROM   table1 
                   GROUP  BY p_id) max_dx 
               ON t.dx = max_dx.dx 
WHERE  t.location_id = 'A1' 

Fidèle à SQL

Si vous n'aimez pas les sous-requêtes pour une raison ou pour une autre, vous pouvez faire un ANTI-JOIN sur une inégalité dans le PK.

SELECT t.* 
FROM   table1 t 
       LEFT JOIN table1 t2
       ON t.p_id = t2.p_id 
          and t.dx < t2.dx
WHERE
     t2.dx IS NULL
     and t.location_id = 'A1'

Fidèle à SQL

0voto

itadapter Points 372

La manière la plus stupide :

SELECT TOP 1 PRODUCT_ID
FROM YOUR_TABLE
WHERE
 LOCATION_ID = "A1" -- of course use parameter in real application!
ORDER BY
 ID DESC

TOUTEFOIS ! C'est faux car on ne peut pas se fier en toute sécurité au séquençage des IDS (même si cela fonctionne dans 99 % des cas). Pourquoi ne pas ajouter une colonne d'horodatage ?

Vous pouvez également utiliser une fonction MAX() pour obtenir une sous-requête renvoyant l'ID maximum :

SELECT PRODUCT_ID
 FROM YOUR_TABLE
 WHERE
 LOCATION_ID = "A1" -- of course use parameter in real application!
AND
 ID = SLECT MAX(ID) FROM YOUR_TABLE WHERE LOCATION_ID = "A1"

0voto

jlnorsworthy Points 2406

Vous pouvez utiliser ROW_NUMBER pour obtenir la dernière localisation sans utiliser de sous-requête corrélée.

SELECT * FROM
(
    SELECT p_id, location_id, ROW_NUMBER() OVER(PARTITION BY p_id ORDER BY idx DESC) RowNumber
) x
WHERE RowNumber = 1 AND location_id = 'A1'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X