我有一张表格products
,看起来像这样:
productID | version | done
1 | 1 | 2000-01-01
1 | 2 | NULL
2 | 1 | NULL
2 | 2 | 2000-01-01
假定版本正在增加。
我想要的是一个查询,该查询返回一个ProductID及其最高/当前版本,如果该版本的“完成”列为NULL。用通俗的英语讲,我希望所有未使用最新版本的产品以及相应的版本。目标:在产品中,找到尚未“完成” /处理的具有新版本的产品。
注意:在上面的示例中,我希望查询仅返回ProductID 1,版本2。我不想要产品的最高未完成版本,而我想要产品的最高版本(如果未完成)。对不起,如果澄清太过分。
我写了一个查询,该查询似乎可以满足我的要求:
SELECT productID ProductID, version Version
FROM products
WHERE done IS NULL
AND version IN (
SELECT MAX(version)
FROM products
GROUP BY productID
)
但是,它似乎也不是很有效。所以我的问题是,有没有更好的方法来处理此查询?
答案 0 :(得分:2)
我们可以在此处尝试使用ROW_NUMBER
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY productID ORDER BY version DESC) rn
FROM products
)
SELECT productID, version
FROM cte
WHERE rn = 1 AND done IS NULL;
根据版本,上述CTE会为每个产品的最新记录分配一个从1开始的行号。然后,我们子查询并仅保留最新记录未恰好为done
列分配值的产品记录。
答案 1 :(得分:1)
似乎您的查询几乎是正确的,所缺少的是productID
的{{1}}与主表之间的相关性。
subquery
另一种解决方案是使用SELECT t.productID ProductID, t.version Version
FROM products t
WHERE t.done IS NULL
AND version IN (
SELECT MAX(p.version)
FROM products p
WHERE p.productID = t.productID
GROUP BY p.productID
)
join