选择值最大且列为空的行

我有一张表格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 
)

但是,它似乎也不是很有效。所以我的问题是,有没有更好的方法来处理此查询?

chensiduan 回答:选择值最大且列为空的行

我们可以在此处尝试使用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;

Demo

根据版本,上述CTE会为每个产品的最新记录分配一个从1开始的行号。然后,我们子查询并仅保留最新记录未恰好为done列分配值的产品记录。

,

似乎您的查询几乎是正确的,所缺少的是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
本文链接:https://www.f2er.com/3162773.html

大家都在问