Sql -after group by by我需要获取最新日期的行

时间:2016-01-28 08:17:34

标签: sql sql-server sql-server-2008

我需要在sql中编写一个查询,但我无法正确执行。我有一个包含7列1st_num,2nd_num,3rd_num,opening_Date,Amount,code,cancel_Flag的表。

对于每个1st_num,2nd_num,3rd_num,我只想带有min(cancel_flag)的记录,如果有超过1行,那么请选择最新的开始日期。

但是当我分组并为相关字段选择最小值和最大值时,我得到了一些行,例如:

1. 12,130,45678,2015-01-01,2005,333,0
2. 12,130,45678,2015-01-09,105,313,0

结果将是

:12,130,45678,2015-01-09,2005,333,0

并将行混合为一个 Microsoft sql server 2008。使用visual studio 2008的ssis 我的代码是:

SELECT 
    1st_num, 
    2nd_num,
    3rd_num,
    MAX(opening_date),
    MAX (Amount),
    code,
    MIN(cancel_flag) 
FROM do. tablename 
GROUP BY 
    1st_num, 
    2nd_num,
    3rd_num,
    code
HAVING COUNT(*) > 1

如何在没有混合值的情况下使用带有最大日期或.min取消标记的行?

由于安全原因,我无法发布我的代码,但我相信你可以提供帮助。

谢谢你, 奥伦

2 个答案:

答案 0 :(得分:1)

这样很难回答,因为每个DBMS都有不同的语法。

无论如何,对于大多数dbms来说这应该有效。使用row_number()函数对行进行排名,并按照我们的定义(所有条件)仅采用第一行:

SELECT * FROM (
    SELECT t.*,
    ROW_NUMBER() OVER ( PARTITION BY t.1st_num,t.2nd_num,t.3rd_num order by t.cancel_flag asc,t.opening_date desc) as row_num
    FROM YourTable t ) as tableTempName
WHERE row_num = 1

答案 1 :(得分:0)

只要没有其他具有相同的1st_num,2nd_num,3rd_num的行具有较低的cancel_flag值,或者具有相同的cancel_flag但具有较高的opening_Date,则使用NOT EXISTS返回行。

select *
from tablename t1
where not exists (select 1 from tablename t2
                  where t2.1st_num = t1.1st_num
                    and t2.2nd_num = t1.2nd_num
                    and t2.3rd_num = t1.3rd_num
                    and (t2.cancel_flag < t1.cancel_flag
                         or (t2.cancel_flag = t1.cancel_flag and
                             t2.opening_Date > t1.opening_Date)))

核心ANSI SQL-99,预计可以(几乎)使用任何dbms。