[英]select most recent record from denormalized table
我有一個設置有列的表:
數據基本上是非規范化的,所以看起來像
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.