我有一个像以下
的表格结构idx p_id location_id
1 CTX A1
2 CTX A2
3 ABC A3
4 ABC A1
idx是自动递增编号并指示最新位置 (对于产品CTX情况,它从A1转移到A2)
现在,我想要找到的是位置A1的任何产品。 我应该只找到产品ABC,因为产品CTX从A1移到A2,它不再在A1
有没有简单的方法来执行SQL查询?
答案 0 :(得分:3)
假设您要查找给定p_id的max dx的位置为'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'
如果由于某种原因你不喜欢子查询,你可以对PK上的不等式进行ANTI-JOIN
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'
答案 1 :(得分: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';
答案 2 :(得分:0)
最愚蠢的方式:
SELECT TOP 1 PRODUCT_ID
FROM YOUR_TABLE
WHERE
LOCATION_ID = "A1" -- of course use parameter in real application!
ORDER BY
ID DESC
无论其!这是不正确的,因为人们无法安全地依赖IDS的排序(即使它在99%的情况下有效)。为什么不添加时间戳列?
您还可以使用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"
答案 3 :(得分:0)
您可以使用ROW_NUMBER获取最新位置,而无需使用相关子查询。
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'