2

假设我有两张表,一张包含以下列称为租约期:

租户交易名称、套件 ID、租赁 ID、建筑 ID

另一个,称为lease_period_audit,具有以下内容:

audit_date、audit_type、tenant_trading_name、suite_id、lease_id、building_id

每次在lease_period 上更新记录并在lease_period_audit 上进行条目,状态为“已更新”。我正在尝试查找仅对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  

我的思维过程中的缺陷在哪里?如何做到这一点/我应该如何考虑这个?

4

2 回答 2

2

假设审计表还记录了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值的每组连续(按 升序排列)行将通过计算为排名#2 和#3 之间的差异的值来唯一区分。suite_id, lease_id, building_idlp_id

在组内,从第二行开始的每一行与前一行的区别仅在于 的值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

笔记。这假设审计表只记录真正的变化,即不能有两个连续的行具有相同的主键,而所有四列的值都相同。

于 2012-01-10T03:53:42.717 回答
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。将此称为 LPA_BEFORE。要加入 LPA_BEFORE,您必须比较 LPA 和 LPA_BEFORE 中的所有 id,并且 LPA_BEFORE 日期必须是日期小于原始 LPA 的 LPA 中的最大值。将 LPA 的名称与 LPA_BEFORE 进行比较

于 2012-01-07T03:31:00.007 回答