AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 335211
Accepted
tkmagnet
tkmagnet
Asked: 2024-01-26 06:18:56 +0800 CST2024-01-26 06:18:56 +0800 CST 2024-01-26 06:18:56 +0800 CST

查询以查找特定当前值何时发生变化

  • 772

我有 3 个数据表(都包含更多列,但这些是我需要的每个表):

t1:表1

工作ID1 h1Amt h1Dt 地位
101 73.00 12/1/2023 A
124 0.00 2023年10月30日 D
第251章 0.00 2023 年 3 月 1 日 A
255 24:00 11/30/2023 A
256 0.00 12/1/2023 A

t2:表2

工作ID2 h2Amt h2Dt 类型1
101 第0073章 202312 2
101 0000 202308 13
101 0000 202307 1
124 0000 202310 3
124 0000 202306 2
124 0000 202304 13
124 第0079章 202301 3
第251章 0000 202303 2
第251章 第1154章 202301 3
第251章 0000 202212 3
255 第0024章 202311 2
255 0000 202212 3
255 0000 202210 13
255 第0175章 202209 3
256 0000 202312 1
256 0000 202309 13
256 0000 202307 3
256 第0583章 202305 2

t3:表3

工作ID3 h3Dt 类型2
101 12/1/2023 2
101 2023 年 8 月 13 日 13
101 2023 年 7 月 1 日 1
124 2023年10月1日 3
124 2023 年 6 月 1 日 2
124 2023 年 4 月 11 日 13
124 2023 年 1 月 1 日 3
第251章 2023 年 3 月 1 日 2
第251章 2023 年 1 月 1 日 3
第251章 2022年12月1日 3
255 11/1/2023 2
255 20022年12月1日 3
255 2022年10月7日 13
255 2022 年 9 月 1 日 3
256 12/1/2023 1
256 2023年9月5日 13
256 2023 年 7 月 1 日 3
256 2023 年 5 月 1 日 2

在 t1 中,每个 workID 只有一行,这是该 workID 的当前事务。随着数据的添加,所有 3 个表都会更新,其中 t1 仅显示当前事务。在 t2 和 t3 中,有多行,因为它显示每个 workID 的历史事务。

h1Amt 和 h2Amt 列显示相同的成本,但格式不同。此外,h1Dt、h2Dt 和 h3Dt 都反映相同的日期,只是格式不同。

我需要找到特定的当前值以及该值上次更改的时间。就我而言,我正在搜索 0.00 或 0000 的金额以及最后一次更改为该值的时间。此外,状态 (t1) 必须为“A”,类型(t2 或 t3)必须为 1、2 或 3。

这是我正在寻找的输出:

工作ID 数量 日期 类型
第251章 0.00 或 0000 202303 或 3/1/2023 2
256 0.00 或 0000 202307 或 7/1/2023 3

这是我到目前为止想到的,但它返回的金额当前不是 0000 (0.00),或者没有显示当前为 0000 (0.00) 的 workID。

select t2.workID2
     ,min(t2.h2Dt)
     ,min(t2.h2Amt)
from table2 t2
inner join table1 t1 on t2.workID = t1.workID
where not exists (
     select 1
     from table2
     where workID2 = t2.workID2
          and h2Amt <> t2.h2Amt
          and h2Dt > t2.h2Dt
     )
     and t2.h2Amt = '0000'
     and t1.status = 'A'
     and t2.type1 in ('1','2','3')
group by t2.workID2

我没有使用table3,主要是因为table2包含需要的h2Amt。我认为使用 table1 中的 h1Amt 对我来说并不明智,因为它只显示当前的内容。由于状态列,我至少需要使用 table1 。如果我确实使用 table3,则 table1 将是一个要求,因为它是唯一具有状态列的表,但我认为我会遇到查找历史金额的问题,因为它没有记录在 table1 或 table3 中。另外,我遇​​到了在我尝试过的其他查询中获取重复行的问题,包括使用所有 3 个表。

上面是我在大量搜索类似情况后看到的最接近的查询。

希望我已经提供了足够的细节来找到解决方案。提前致谢!

sql-server
  • 1 1 个回答
  • 59 Views

1 个回答

  • Voted
  1. Best Answer
    Ammar Talal
    2024-02-03T15:16:02+08:002024-02-03T15:16:02+08:00

    您需要做的是将 table2 自身连接到它,并在更改为 0000 时过滤掉意义较小的金额,然后过滤日期以专门针对 workID 251 因为它的日期较低,所以不这样做在您的灵魂中使用 min 时显示正确。现在我们可以按最短日期对它们进行分组,然后将所有内容连接在一起并将最终过滤器应用于状态和类型。

    with cte as (
    SELECT 
        t1.workID2,
        min(t1.h2Dt) 'dateChanged'
    from table2 t1
    join table2 t2 
    on t1.workID2 = t2.workID2
    and t1.h2Amt < t2.h2Amt
    and t1.h2Dt > t2.h2Dt
    GROUP by t1.workID2
    )
    SELECT 
        t2.workID2 ,
        t2.h2Amt ,
        t2.h2Dt ,
        t2.type1,
        t1.status 
    from table2 t2
    join cte ct on 
    t2.workID2 = ct.workID2
    and t2.h2Dt = ct.dateChanged
    join table1 t1 on 
    t2.workID2 = t1.workID1 
    WHERE 
        t2.type1 in (1,2,3)
        and t1.status = 'A'
    
    • 2

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve