我有一个如下表结构
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 查询?
假设您要查找给定 p_id 的最大 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'
好的,在重新阅读您的问题后,我认为这更需要您:
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';
最笨的方法:
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"
您可以使用 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'