2017-04-04 81 views
0

比方说,我有以下结果集:应用条件,只有某些行的SQL

col1 col2 timestamp 

val1 1 2016-03-01 12:00:00 
val2 1 2016-05-01 12:00:00 
val2 1 2016-06-01 12:00:00 
val2 2 2016-05-01 12:00:00 
val2 2 2016-04-01 12:00:00 

如果我想申请条件,我想获得行,其中COL2 = 1和时间戳应该是一个最大值。所以对于col2 = 1我只会得到低于行 val2 1 2016-06-01 12:00:00

我不在乎col2 = 2,因为col2 = 2我应该得到所有的行。我只想应用col2 = 1的上述条件。 有没有一种方法可以在sql中执行此操作。

回答

0

使用GROUP BY在JOIN语句:

SELECT * 
FROM table1 
JOIN 
(
    SELECT col2, MAX(timestamp) timestamp 
    FROM table1 
    WHERE Col2 = 1 
    GROUP BY col2 
) A ON A.timestamp = table1.timestamp AND A.col2 = table1.col2 
0

这是一个选项。您可以针对col2窗口函数的值为1。

SELECT COL1 
    , COL2 
    , TIMESTAMP 
FROM MY_TABLE 
WHERE COL2 != 1 
UNION ALL 
SELECT COL1 
    , COL2 
    , TIMESTAMP 
FROM (
    SELECT COL1 
     , COL2 
     , TIMESTAMP 
     , ROW_NUMBER() OVER (ORDER BY TIMESTAMP DESC) RNK 
    FROM MY_TABLE 
    WHERE COL2 = 1 
) TMP 
WHERE RNK = 1 
0

您可以尝试下面的查询。此查询是特定于您的要求:

select * 
from table_name t1 
where ((t1.col2 = 1 
     AND t1.timestamp = (select max(timestamp) 
           from table_name t2 
           where t2.col2 = 1)) 
    OR (t1.col2 <> 1))