SQL Server:获取column2的最大值,column3的值必须为1

时间:2016-06-13 10:26:25

标签: sql sql-server

我的存储过程的某些部分输出如下:

col1      col2  col3 col4
--------------------------
2016-05-05  1    2      2
2016-05-05  1    3     32
2016-05-12  2    1     11
2016-05-12  3    1     31

现在我需要根据这个条件得到结果

col2 = 1 and col3 = max or col3 = 1 
and col2 = max

最终结果应为

col1      col2  col3 col4
-------------------------
2016-05-05  1    3     32
2016-05-12  3    1     31

4 个答案:

答案 0 :(得分:0)

不确定这是否是最有效的方式,但您可以使用ROW_NUMBER()

SELECT * FROM (
    SELECT t.*,
           ROW_NUMBER() OVER(PARTITION BY t.col1 ORDER BY t.col3 DESC) as rnk,
    WHERE t.col2 = 1
    UNION ALL
    SELECT t.*,
           ROW_NUMBER() OVER(PARTITION BY t.col1 ORDER BY t.col2 DESC) as rnk,
    WHERE t.col3 = 1) tt
WHERE rnk = 1

这将为您提供

的所有记录
(col2=1 and col3=max) or (col3=1 and col2=max)

答案 1 :(得分:0)

这有点棘手。您的数据没有歧义,例如col4col2中的col3或“1”值中的重复最大值。

以下是您问题中逻辑的直接翻译:

select t.*
from t
where t.col4 = (select max(t2.col4)
                from t t2
                where t2.col1 = t.col1 and (t2.col2 = 1 or t2.col3 = 1)
               );

答案 2 :(得分:0)

试试这个。请注意,如果有多个maxcol1值,则需要输出中的所有值。它适用于所有情况,即使col2col3col2不同步。

我首先找到col31的最高值,并将其值指定为select col1,col2,col3,col4 from ( select t.*, RANK() OVER(ORDER BY col3 DESC) as col3_max, RANK() OVER(ORDER BY col2 DESC) as col2_max from your_table t ) t1 where (col2=1 and col3_max=1) OR (col3=1 and col2_max=1) 。然后在外部查询中,我正在使用您的连接条件。为Postgres DB创建的演示作为SQLServer不可用。

SQLFiddle Demo

{{1}}

答案 3 :(得分:0)

替代方式:

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY iif(col2 = 1, col3, col2) DESC) as r
    FROM tbl) t
WHERE r = 1