2012-01-05 37 views
2

假設我有兩個表,一個一個名爲lease_period以下的列時:查詢幫助使用審覈表

tenant_trading_name,suite_id,lease_id,building_id

和另一個具有以下稱爲lease_period_audit :

audit_date,audit_type,tenant_trading_name,suite_id,lease_id,building_id

每次記錄在lease_period上更新並且在lease_period_audit上進行條目爲'Updated'的條目。我試圖找到只對tenant_trading_name字段進行的所有更新,但沒有取得任何成功。到目前爲止,我有以下內容:

select    lpa.* 
from    property.lease_period_audit lpa 
inner join   property.lease_period lp on lpa.suite_id = lp.suite_id and lpa.lease_id = lp.lease_id and lpa.building_id = lp.building_id 
where    audit_type = 'Updated' 
        and lp.tenant_trading_name <> lpa.tenant_trading_name 
order by   1 desc 

我的思維過程中的缺陷在哪裏?如何做到這一點/我應該如何思考這個問題?

+0

在你的表上使用代理鍵 – 2012-01-07 03:31:39

+0

@rogelware不幸的是,這是工作,所以這不是一個選項(我沒有創建數據庫結構)。 – Codingo 2012-01-07 06:36:04

+1

桌子的主要關鍵是什麼?可以在LP表上更改suite_id,lease_id,building_id嗎? LP或LPA表中是否有其他字段? – 2012-01-07 13:40:19

回答

2

比較LPA的名字假設審計表還記錄了lease_period主鍵列,這裏lp_id引用爲簡單起見,你可以試試下面的辦法:

  1. 找到所有的行,其中audit_type'Updated'

  2. audit_date排列所有行並將它們分區lp_id

  3. audit_date對行排序lp_id, suite_id, lease_id, building_id

  4. 獲取兩個排名之間的差異。

  5. 再次對行排列audit_date,現在將它們分區爲lp_id, suite_id, lease_id, building_id, (ranking_difference)

  6. 輸出最後排名值爲2或更大的所有行。

前四個步驟導致的行集,其中每個組連續的(在audit_date升序)對於相同lp_idsuite_id, lease_id, building_id相同值的行會被作爲之間的差計算出的值來唯一地區別排名#2 &#3。

在組內,從第二個開始的每一行都將與前一個不同,只有tenant_trading_name這個值,這正是我們需要的值。因此,我們再次對行進行排名,並考慮到我們剛剛獲得的「組ID」,然後返回排名爲2或更高的每一行。

這裏有一個近似實現:

WITH marked AS (
    SELECT 
    *, 
    grp = ROW_NUMBER() OVER (PARTITION BY lp_id 
           ORDER BY audit_date) 
     - ROW_NUMBER() OVER (PARTITION BY lp_id, suite_id, lease_id, building_id 
           ORDER BY audit_date) 
    FROM lease_period_audit 
    WHERE audit_type = 'Updated' 
), 
ranked AS (
    SELECT 
    *, 
    rnk = ROW_NUMBER() OVER (PARTITION BY lp_id, suite_id, lease_id, building_id, grp 
           ORDER BY audit_date) 
    FROM marked 
) 
SELECT 
    audit_date, 
    lp_id, 
    tenant_trading_name, 
    suite_id, 
    lease_id, 
    building_id 
FROM ranked 
WHERE rnk = 2 

注意。這假定審計表只記錄實際更改,即不能有兩個具有相同主鍵的連續行,其中所有四列具有相同的值。

1

你應該想到是這樣的(僞代碼):

編輯:我以前沒有意識到,LPA表實際上擁有所有的數據,沒有必要加入與LP

select lpa.* 
from lpa 
join lpa_before on 
      lpa_before.id = lpa.id and 
      lpa_before.date = 
        (select max(date) from lpa3 where lpa3.date < lpa.date and lpa.id = lpa3.id) 
where auditytype = 'update' and lpa.name <> lpa_before.name 

我希望我可以解釋。(這不是一個簡單的解決方案,但多數民衆贊成在我腦海中)

英文:

選擇LPA寄存器。 加入另一個LPA,它將在原始LPA之前成爲LPA。調用此LPA_BEFORE。 要加入LPA_BEFORE,必須比較來自LPA和LPA_BEFORE的所有ID,並且LPA_BEFORE日期必須是日期少於原始LPA的LPA中的最大值。 與LPA_BEFORE