【问题标题】:Select certain records and add them to a queue table选择某些记录并将它们添加到队列表
【发布时间】:2020-01-18 20:01:12
【问题描述】:

我有一个表(Table1),它为每个帐户存储了几个快照。如果任何列 val1、val2、val3、val4、val5 的值发生变化,我们每天都可能会收到/插入新的快照到帐户

表1

T1ID    Account#    snapshotDate    val1    val2    val3    val4    val5
1       1001        1/1/2017        1111    2222    3333    4224    5551
2       1001        1/1/2018        1111    2222    3333    4444    5551
3       1001        1/1/2019        1111    2222    3333    4444    5550
4       2002        1/1/2017        123     1234    12345   123456  3434
5       2002        1/1/2018        123     1212    12345   123456  3434
6       2002        1/2/2019        333     1212    62626   252525  3434

我想每周从 Table1 中提取这些帐户的更新快照,并将它们添加到表/队列 (Table2) 中,前提是它是第一个快照或某些列发生更改(val2 或 val5)

表2

T2ID    T1ID
01      1
02      3
03      4
04      5
  • 帐户# 1001 的 T1ID 1 已添加,因为它是第一个快照
  • 未添加帐户# 1001 的 T1ID 2,因为列(val2 或 val5)没有变化
  • 帐户# 1001 的 T1ID 3 由于列 (val5) 的更改而被添加
  • 添加了帐户# 2002 的 T1ID 4,因为它是第一个快照
  • 添加帐户# 2002 的 T1ID 5 是因为 (val2) 列发生更改
  • 未添加帐户# 2002 的 T1ID 6,因为列(val2 或 val5)没有变化

Table2 将用作每个帐户的更改队列,这些更改将被发送到另一个进程。

我可以为此使用的最佳优化查询是什么?

【问题讨论】:

  • 你试过什么?请向我们展示您的尝试。
  • 确实,不要要求“最佳优化查询”。试着先做一些事情。然后征求意见以改进它。
  • 对不起我的问题是如何实现它?我需要一些关于如何做的想法?
  • 为什么没有 T1ID 6 的记录?
  • 因为没有更改列(val2 或 val5)

标签: sql sql-server tsql


【解决方案1】:

使用LAG()ROW_NUMBER()

在子查询中,您可以恢复 2 列中每一列的最后一个值,以比较按日期排序的帐户分区。然后,外部查询可以引入每个组中的第一条记录,以及两个相关值中的任何一个发生变化的记录。

SELECT 
    ROW_NUMBER() OVER(ORDER BY t1id) t2id,
    t1id
FROM (
    SELECT
        t.*,
        ROW_NUMBER() OVER(PARTITION BY [Account#] ORDER BY snapshotDate) rn,
        LAG(val2) OVER(PARTITION BY [Account#] ORDER BY snapshotDate) lval2,
        LAG(val5) OVER(PARTITION BY [Account#] ORDER BY snapshotDate) lval5
    FROM mytable t
) x
WHERE 
    rn = 1
    OR NOT (val2 = lval2)
    OR NOT (val5 = lval5)

Demo on DB Fiddle

t2id | t1id :--- | ---: 1 | 1 2 | 3 3 | 4 4 | 5

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 2011-11-26
    • 2012-11-29
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多