2011-11-01 86 views
0

我有一个设置了列的表:从非规范化表中选择最近的记录

  • FNAME
  • LNAME
  • 地址
  • 城市
  • 状态
  • 拉链
  • 客户ID
  • date_modifi ED

的数据基本上非规范化所以看起来像

 
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 

我想这些记录复制到新表,但我只希望每个客户ID的一个记录。

我试着做一些像

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 
group by (fname,lname,address,city,state,zip,Customer_ID,date_modified) 

的问题是存在具有相同的含义,但不同的文字(第一VS 1)太多地址等栏目。所以该组通过将这两个记录留在新表中。我如何通过选择max(修改日期)来为每个客户ID获取一条记录。基本上我想通过customer_id而不是其他列进行分组,但这在oracle中是不允许的。

+0

请注意'group by'不是函数。括号完全没用。 –

+0

通过更改数据库设计可以更好地满足您的需求,但这个问题存在一些问题。根据需要:1)将地址拆分到自己的表中,然后在地址和客户之间创建一个交叉引用表。 2)将名称分割到自己的表中,然后将名称和客户之间的交叉引用表与“part_of_name”(即 - family,given,nick等)列相关联。 –

回答

0

以下是几种获得你想要的方法之一。请记住,这是而不是正常化您的数据库。你仍然有一个customer_id与第一个和最后一个名字和一个地址。我可能会把它变成几个插入,一个是获取所有唯一的客户ID以及Customers表的最新名称信息,然后是另一个地址插入。如果您需要更改的历史信息,那么您需要适当调整。

此外,下面的代码将无法正常如果您有具有完全相同的客户ID 相同确切date_modified两排工作。如果你遇到这种情况,你需要拿出适当的业务逻辑来处理。

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 
0

这很容易通过使用分析(又名窗口)函数为每个客户选择第一行。如果两行具有相同的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 
相关问题