当前位置: 首页 > 面试题库 >

使用审核表时查询帮助

杜曜灿
2023-03-14
问题内容

假设我有两个表,其中一个表包含名为column_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上进行记录,状态为“已更新”。我正在尝试查找仅对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

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


问题答案:

假设审核表还记录了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),用相同的值的行suite_id, lease_id, building_id对于相同lp_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

笔记。这假定审计表仅记录实际更改,即,不能有两个具有相同主键的连续行,其中所有四个列都具有相同的值。



 类似资料:
  • 我有模板实体,它具有: 我正在使用postgres数据库

  • 问题内容: 我正试图消除我的SQL技能,并需要以下查询的帮助。我当前使用的数据库是mysql。 我想检索所有同时分配了’tag2’和’tag4’的抽认卡。根据现有表的内容(如以下摘录所示),查询应返回两行:FlashCard_ID 1和2。 我将如何制定此查询?自从我不得不做这样的事情已经有一段时间了。 问题答案:

  • 接口说明 审核用户的注册申请 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/user/1.0.0/check 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 guid string form 是 用户ID status int form 是 用户状态[0:未审核;1:已审核] 响应字段说明 无 响应

  •   如欲对系统中各运行支持库内的命令、库定义数据类型、库定义常量等等信息进行查找,请在易系统启动后使用以下方法之一: 直接在工作夹内的支持库夹中单击对应的所欲查找其信息的项目,此时所有的相关信息将会显示在系统的提示夹或者状态行中,如下图,光标处; 如果欲将这些信息提取出来打印或者以后阅读,请在相应项目上单击鼠标右键,在所弹出的菜单中选择“拷贝帮助文本到剪贴板”或者“写帮助文本到文件”功能输出与该项

  • 问题内容: 我想从t1中获取名称,并在t2中获得与ID在t1上相同的行数。 到目前为止,我已经掌握了上述内容,但是如果t2中没有匹配的行,它将不会返回任何数据。如果没有行,则我希望将其设置为0(或NULL),并且名称仍然返回。 编辑: 我希望能够按降序排序。(或ASC)可行吗? 问题答案: 这应该为您工作: 左联接确保您拥有t1中的所有行,而COUNT(。)使其仅计算t2.id不为null的记录(

  • 我正在使用Hibernate恩维尔斯来审计实体。有可能获得实体的所有版本/修订版,如下所示: 但这需要花费太多时间,因为它将所有表连接在一起(在此示例中为 rev、soup_aud ingredients_aud)。我只需要Soup_AUD的值。 如何使用自定义查询从审计表中选择值? 汤.java: 成分.java: