Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从非规范化表中选择最近的记录_Sql_Oracle_Select - Fatal编程技术网

Sql 从非规范化表中选择最近的记录

Sql 从非规范化表中选择最近的记录,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 问题是有太多的地址和其他列具有相

我有一个列设置的表:

文件名 名字 住址 城市 状态 拉链 客户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