所以我有两个表(假设x和y)。两个表中的大多数数据都是重复的,但是有些行是不同的。我将来自这两个表的全部数据插入到一个新表中(假设为table_mixed)。有一列表示表格的日期,例如x的20190307和y的20190308因此,对于任何重复的行,将有一个不同的日期列。
num Code col1 col2 col3..... import_date file_date
-------- --------- ----------------- ---------- ----------
01 AA ...... 20190308 20190307
01 AA ...... 20190308 20190308
02 AA ...... 20190308 20190307
03 BB ...... 20190308 20190308
我想做的是,我想查询一个数据,以便在两个表中都显示非重复的行,对于任何重复的行,仅显示最近日期的行。
我已经找到了一些发现,并且已经尝试过:
select *,max(file_date) over (partition by stx_import_date) max_date
from table_mixed;
其中file_date是一个日期,该日期告诉每个表不同的日期,并且两个表的每一行都具有相同的import_date。
num Code col1 col2 col3...... import_date file_date max_date
-------- --------- ------------ ---------- ----------
01 AA ...... 20190308 20190307 20190308
01 AA ...... 20190308 20190308 20190308
02 AA ...... 20190308 20190307 20190307
03 BB ...... 20190308 20190308 20190308
此查询的结果显示每一行(包括所有重复的行),并添加另一列(max_date),该列仅显示每一行的最新file_date。但我希望结果仅显示我上面提到的内容,而不显示其他列(max_date)。
这是我正在寻找的结果:
num Code col1 col2 col3... import_date file_date
-------- --------- ------------ ---------- --------
01 AA ...... 20190308 20190308
02 AA ...... 20190308 20190307
03 BB ...... 20190308 20190308
谢谢
PS不仅需要重复的列号,代码和导入日期,而且还需要其他列.....所以,我的意思是重复的行>>除了file_date(我有10多个列)之外的每一列
P.S.2我编辑了示例,以便您想让我理解。还有其他列(例如col1,col2,col3等)也可以使用。在这种情况下,我应该如何使用分区方式
答案 0 :(得分:0)
使用row_number窗口功能。
num,code,import_date..etc
列上进行分区。 file_date
desc 示例查询:
Select * from (
select *,row_number() over (partition by num,code,stx_import_date order by file_date desc) row_number
from table_mixed)t
where t.row_number = 1;
答案 1 :(得分:0)
您似乎在乎num
列,只想要最新的数据。您可以使用混合表来做到这一点:
select tm.*
from (select tm.*,
row_number() over (partition by num, code, . . . order by file_date desc) as seqnum
from table_mixed
) tm
where seqnum = 1;
注意:如果文件日期相同,则将选择任意行。
在创建混合表时,这样做可能更有效。您可以这样做:
select y.*
from y
union all
select x.*
from x left join
y
on x.num = y.num and
x.code = y.code and
. . .
where y.num is null;
这将返回来自y
(最近的)的所有行以及来自x
的所有不匹配的行(并假定所有列值都不是NULL
)。
答案 2 :(得分:0)
也许通过区分日期字段的MAX()进行区分?
;WITH get_max_dt AS (
SELECT TM.[num]
, TM.[Code]
, TM.[import_date]
, MAX(TM.[file_date]) AS [file_date]
FROM table_mixed AS TM
GROUP BY TM.[num],TM.[Code],TM.[import_date]
)
SELECT *
FROM get_max_dt
输出:
num Code import_date file_date
01 AA 20190308 20190308
02 AA 20190308 20190307
03 BB 20190308 20190308