Sql 从非规范化表中选择最近的记录
我有一个列设置的表: 文件名 名字 住址 城市 状态 拉链 客户ID 修改日期 数据基本上是非规范化的,所以看起来 Ben -- Smith--***123first*** st -- NY -- NY -- 12101 -- 123 -- 1-1-2011 Ben -- Smith--***123 1st st*** -- NY -- NY -- 12101 -- 123 -- 1-1-2011 Sara -- Smith -- BLAH BLAH BLAhSql 从非规范化表中选择最近的记录,sql,oracle,select,Sql,Oracle,Select,我有一个列设置的表: 文件名 名字 住址 城市 状态 拉链 客户ID 修改日期 数据基本上是非规范化的,所以看起来 Ben -- Smith--***123first*** st -- NY -- NY -- 12101 -- 123 -- 1-1-2011 Ben -- Smith--***123 1st st*** -- NY -- NY -- 12101 -- 123 -- 1-1-2011 Sara -- Smith -- BLAH BLAH BLAh 问题是有太多的地址和其他列具有相
问题是有太多的地址和其他列具有相同的含义,但不同的文本首先与第一。因此,GROUPBY将这两条记录都保留在新表中。如何通过选择maxdate modified为每个客户id获取一条记录。基本上,我只想按客户id进行分组,而不是按其他列进行分组,但oracle不允许这样做。以下是获得您想要的内容的几种方法之一。但请记住,这不会规范化数据库。您在中仍然有一个客户id,其中包含姓名和地址。我可能会将其转换为几个插入,一个用于获取所有唯一的客户ID以及Customers表的最新名称信息,然后另一个用于地址的插入。如果需要更改的历史信息,则需要进行适当调整 此外,如果有两行具有相同的客户ID和相同的修改日期,则下面的代码将无法正常工作。如果遇到这种情况,您将需要拿出适当的业务逻辑来处理
INSERT INTO New_Table (
fname,
lname,
address,
city,
state,
zip,
Customer_ID,
date_modified )
SELECT
OT1.fname,
OT1.lname,
OT1.address,
OT1.city,
OT1.state,
OT1.zip,
OT1.customer_id,
OT1.date_modified
FROM
(
SELECT
customer_id,
MAX(date_modified) AS latest_date_modified
FROM
Old_Table
GROUP BY customer_id) SQ
INNER JOIN Old_Table OT1 ON
OT1.customer_id = OT1.customer_id AND
OT1.date_modified = SQ.latest_date_modified
通过使用分析窗口功能为每个客户选择第一行,这非常容易。如果两行的修改日期相同,则不确定采用哪一行
INSERT INTO new_table (fname,lname,address,city,state,zip,Customer_ID,date_modified)
SELECT fname,
lname,
address,
city,
state,
zip,
Customer_ID,
date_modified
FROM (
SELECT fname,
lname,
address,
city,
state,
zip,
Customer_ID,
date_modified,
row_number() over (partition by customer_id order by date_modified desc) as rn
)
WHERE rn = 1
请注意,group by不是一个函数。括号是完全没有用的。你最好改变你的数据库设计,这一个有一些问题。根据需要:1将地址拆分到自己的表中,然后在地址和客户之间创建一个交叉引用表。2将名称拆分到自己的表中,然后在名称和客户之间创建一个交叉引用表,其中包含一列“名称的组成部分”,即“家族”、“给定”、“尼克”等。
INSERT INTO new_table (fname,lname,address,city,state,zip,Customer_ID,date_modified)
SELECT fname,
lname,
address,
city,
state,
zip,
Customer_ID,
date_modified
FROM (
SELECT fname,
lname,
address,
city,
state,
zip,
Customer_ID,
date_modified,
row_number() over (partition by customer_id order by date_modified desc) as rn
)
WHERE rn = 1