2

次のようなテーブル構造があります

idx   p_id    location_id  

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

idx は自動インクリメント番号で、最新の場所を示します (製品 CTX の場合、A1 から A2 に転送されました)。

今、私が見つけたいのは、ロケーション A1 にある製品です。製品 CTX が A1 から A2 に移動したため、製品 ABC のみを検索する必要があります。A1 にはありません。

SQLクエリを実行する簡単な方法はありますか?

4

4 に答える 4

3

Assuming you want to find all rows where the max dx for a given p_id has a location of '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' 

SQL Fiddle

If you don't like sub queries for some reason you can do an ANTI-JOIN on an inequality on the 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'

SQL Fiddle

于 2012-12-28T18:43:15.263 に答える
1

さて、あなたの質問を読み直した後、これはあなたが必要としているものだと思います:

SELECT idx, p_id, location_id
FROM tablename t0 JOIN (
  SELECT MAX(idx) AS m
  FROM tablename
  GROUP BY p_id) t1
  ON t0.idx = t1.m
WHERE t0.location_id = 'A1';
于 2012-12-28T18:40:07.823 に答える
0

The dumbest way:

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

HOWEVER! This is incorrect because one can not safely rely on sequencing of IDS,(even if it works in 99% of cases). Why don't you add a timestamp column?

You can also use a MAX() function to get a subquery returning max ID:

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"
于 2012-12-28T18:42:10.330 に答える
0

You can use ROW_NUMBER to get the latest location without using a correlated subquery.

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'
于 2012-12-28T18:44:27.007 に答える