如何筛选特定列的最新值

时间:2017-06-08 17:38:08

标签: sql sql-server

在Sat / Sun上运行的计划作业之后,在前后状态下运行包含多行显示数据库表统计信息的查询。

Select [batchNum] ,[RunDate] ,[tableName] ,[numberofRows] ,[dataSize]
FROM TableNames
ORDER BY RunDate ASC

前/后按批号区分。例如,该表的批号为2-159。在哪里' 158'是之前的'来自上周末运行的预定作业的作业/批次,批处理159将是之后的。

    batchNum    RunDate             tableName   numberofRows    dataSize 
    158         06/04/2017 04:30:51 TableData1  1700            104        
    158         06/04/2017 04:30:51 TableData2  1276             99
    158         06/04/2017 04:30:51 TableData3  1700            157        
    158         06/04/2017 04:30:51 TableData4   200             47        

    159         06/04/2017 05:30:51 TableData1  1500             85        
    159         06/04/2017 05:30:55 TableData2  1134             94        
    159         06/04/2017 05:30:57 TableData3  1500            101        
    159         06/04/2017 05:30:59 TableData4   167             40        

由于批处理将始终是循环的,因此我想过滤此查询,以便在最近的一个周末只返回最近一次批处理的行。

5 个答案:

答案 0 :(得分:1)

Select [batchNum], [RunDate], [tableName], [numberofRows], [dataSize]
  FROM TableNames t1
 where not exists(select *
                    from TableNames t2
                   where t2.batchNum > t1.batchNum)
 ORDER BY RunDate ASC;

答案 1 :(得分:0)

在select和所需的所有其他数据中创建一个子查询:

WHERE rownum = 1

然后在外部查询

中取template<typename _Res, typename... _ArgTypes> template<typename _Functor, typename> function<_Res(_ArgTypes...)>:: function(_Functor __f) : _Function_base() { typedef _Function_handler<_Signature_type, _Functor> _My_handler; // don't need to care about details below, but when it uses __f, it // either uses std::move, or passes it by references if (_My_handler::_M_not_empty_function(__f)) { _My_handler::_M_init_functor(_M_functor, std::move(__f)); _M_invoker = &_My_handler::_M_invoke; _M_manager = &_My_handler::_M_manager; } }

答案 2 :(得分:0)

您是否正在寻找最新的批次和状态记录,然后您可以查询如下:

Select top 1 [batchNum], [RunDate], [tableName], [numberofRows], [dataSize]
   From yourtable
   Order by BatchNum desc, RunDate desc

如果您要查找每个批次的最新RunDate记录,那么您可以查询如下:

Select top(1) with ties [batchNum], [RunDate], [tableName], [numberofRows], [dataSize] From yourtable
   Order by row_number() over(partition by BatchNum order by RunDate desc)

答案 3 :(得分:0)

试试这个

select * from (
Select [batchNum] ,[RunDate] ,[tableName] ,[numberofRows] ,[dataSize],
row_number() over(partition by tableName  order by batchNum desc) rang
FROM TableNames
) tmp where rang=1

答案 4 :(得分:0)

其他解决方案:

with maxi as
(
 select [tableName], max([batchNum]) MaxNum TableNames
 group by [tableName]
)
Select f1.*
FROM TableNames f1 
inner join maxi f2 on f1.tableName=f2.tableName and f1.batchNum=f2.MaxNum