我需要在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取消标记的行?
由于安全原因,我无法发布我的代码,但我相信你可以提供帮助。
谢谢你, 奥伦答案 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。