簡體   English   中英

從非規范化表中選擇最新記錄

[英]select most recent record from denormalized table

我有一個設置有列的表:

  • 名字
  • 地址
  • 壓縮
  • 顧客ID
  • date_modified

數據基本上是非規范化的,所以看起來像

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)

問題是地址和含義相同但文字不同的其他列過多(第一對第一)。 因此group by將這兩個記錄都保留在新表中。 我如何通過選擇max(修改日期)來為每個客戶ID獲得一條記錄。 基本上,我只想按customer_id而不是其余的列進行分組,但這在oracle中是不允許的。

以下是獲得您想要的東西的幾種方法之一。 請記住,盡管這不能規范您的數據庫。 您仍然有一個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

通過使用分析(aka窗口)功能為每個客戶選擇第一行,這非常容易。 如果兩行具有相同的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM