仅选择具有上次修改时间戳的行,不选择具有相同 ID 和旧时间戳的重复行

2023-12-09

我找不到解决我的问题的方法。我有两个表 Order 和 OrderDetail。

订单表 (简单版)

| ID | modified  |
| 1  | 7.1.2018. |
| 2  | 10.1.2018.|
| 3  | 15.1.2018.|
| 4  | 20.1.2018.|
| 5  | 25.1.2018.|

订单详细信息(简单版)

| order_id | detail_id | base_price | buy_price | sell_price|
| 1        | 1         | 99.00      | 111.00    | 122.00    |
| 1        | 2         | 82.00      | 95.00     | 117.00    | 
| 1        | 3         | 82.00      | 95.00     | 117.00    |
| 2        | 4         | 95.00      | 108.00    | 119.00    | 
| 2        | 5         | 86.00      | 94.00     | 115.00    | 
| 2        | 1         | 82.00      | 95.00     | 117.00    |
| 3        | 1         | 92.00      | 106.00    | 116.00    | 
| 3        | 4         | 90.00      | 100.00    | 120.00    | 
| 3        | 5         | 82.00      | 95.00     | 117.00    |
| 4        | 2         | 92.00      | 106.00    | 116.00    | 
| 4        | 3         | 90.00      | 100.00    | 120.00    | 
| 4        | 1         | 82.00      | 95.00     | 117.00    |
| 5        | 1         | 92.00      | 106.00    | 116.00    | 
| 5        | 5         | 90.00      | 100.00    | 120.00    | 
| 5        | 3         | 82.00      | 95.00     | 117.00    |

如何从 OrderDetails 表中获取与 Order 表中的上次修改时间戳相关的行?

结果应该是:

| order_id | detail_id | base_price | buy_price | sell_price | modified  |
| 5        | 1         | 92.00      | 106.00    | 116.00     | 25.1.2018.|
| 4        | 2         | 92.00      | 106.00    | 116.00     | 20.1.2018.|
| 5        | 3         | 82.00      | 95.00     | 117.00     | 25.1.2018.|
| 3        | 4         | 90.00      | 100.00    | 120.00     | 15.1.2018.|
| 5        | 5         | 90.00      | 100.00    | 120.00     | 25.1.2018.|

我知道连接表,并从具有所需列的联合表中获取所有行,但我不知道如何仅过滤每个具有最新时间戳的行订单 ID、详细信息 ID一对。请您提供任何帮助,我们将不胜感激。

Edit

需要查询的是Firebird数据库。

Edit 2.

第一个样本数据在某种程度上具有误导性。请再次查看扩展表和理想结果。 我需要所有不同的行(基于“details_id”)及其最后修改的数据。如何使用较旧的时间戳排除每个“detail_id”的“重复”行,并仅保留具有最新时间戳的“detail_id”行???


with x as (select o.modified, od.* 
           from orderDetails od, orders o
           where o.id=od.order_id)
 , mx as (select max(modified) as modified, detail_id
          from x group by detail_id)
Select x.* from x, mx
Where x.detail_id = mx.detail_id and x.modified=mx.modified

这里我们使用通用表表达式,因此我们仅将两个表连接一次。 至少我们在编写查询时只做了一次 - 因此我们出现拼写错误或复制粘贴错误的机会会更少。 我们还提示 SQL Server 仅执行一次连接,然后重用它,但它是否会遵循此提示 - 取决于其内部实现。

CTE 的另一个好处是:它可以帮助您从简单到复杂逐步增量地构建查询。阅读有关 Read-eval-print 循环的内容:https://en.wikipedia.org/wiki/REPL
稍后我会添加更多内容。

你可以在Google中找到很多关于CTE的文章。 Firebird 的实现记录如下:https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-dml-select.html#fblangref25-dml-select-cte

由于我只使用了非常基本的 SQL,我相信它几乎可以在任何实用的 SQL 服务器上工作,包括 Firebird。

这是查询结果和输出数据:SQL小提琴

PostgreSQL 9.6 架构设置:

create table orders
 (id integer primary key,
  modified timestamp);
create index o_m on orders(modified);  

create table OrderDetails(
  order_id integer references orders(id),
  detail_id integer not null,
  base_price float,
  buy_price float,
  sell_price float );
create index od_do on OrderDetails(detail_id, order_id);

Insert into orders values
( 1, '2018-1-07'),
( 2, '2018-1-10'),
( 3, '2018-1-15'),
( 4, '2018-1-20'),
( 5, '2018-1-25');

Insert into OrderDetails values
(   1   ,   1   ,   99.00   ,   111.00  ,   122.00  ),
(   1   ,   2   ,   82.00   ,   95.00   ,   117.00  ),
(   1   ,   3   ,   82.00   ,   95.00   ,   117.00  ),
(   2   ,   4   ,   95.00   ,   108.00  ,   119.00  ),
(   2   ,   5   ,   86.00   ,   94.00   ,   115.00  ),
(   2   ,   1   ,   82.00   ,   95.00   ,   117.00  ),
(   3   ,   1   ,   92.00   ,   106.00  ,   116.00  ),
(   3   ,   4   ,   90.00   ,   100.00  ,   120.00  ),
(   3   ,   5   ,   82.00   ,   95.00   ,   117.00  ),
(   4   ,   2   ,   92.00   ,   106.00  ,   116.00  ),
(   4   ,   3   ,   90.00   ,   100.00  ,   120.00  ),
(   4   ,   1   ,   82.00   ,   95.00   ,   117.00  ),
(   5   ,   1   ,   92.00   ,   106.00  ,   116.00  ),
(   5   ,   5   ,   90.00   ,   100.00  ,   120.00  ),
(   5   ,   3   ,   82.00   ,   95.00   ,   117.00  );

Query 1:

with x as (select o.modified, od.* 
           from orderDetails od, orders o
           where o.id=od.order_id)
 , mx as (select max(modified) as modified, detail_id
          from x group by detail_id)
Select x.* from x, mx
Where x.detail_id = mx.detail_id and x.modified=mx.modified
Order by detail_id

Results:

|             modified | order_id | detail_id | base_price | buy_price | sell_price |
|----------------------|----------|-----------|------------|-----------|------------|
| 2018-01-25T00:00:00Z |        5 |         1 |         92 |       106 |        116 |
| 2018-01-20T00:00:00Z |        4 |         2 |         92 |       106 |        116 |
| 2018-01-25T00:00:00Z |        5 |         3 |         82 |        95 |        117 |
| 2018-01-15T00:00:00Z |        3 |         4 |         90 |       100 |        120 |
| 2018-01-25T00:00:00Z |        5 |         5 |         90 |       100 |        120 |

请注意,如果您有两个或多个具有相同时间戳的订单,则会有不同的输出!看来你根本没有想过这种可能性——但既然有可能,它最终就会发生。

Now, 返回 CTE 和 REPL.

当您逐步构建查询时,从第一个模糊的想法到特定的行,最好检查输出数据是否正是您所期望的。 “大象大不如小块吃”。

在这里我将向您展示查询的逐步构建。 如果您在上面链接的 SQL Fiddle 中重复这些步骤,将会很有用。

首先,我创建并填充了表。

然后我发出第一个查询只是为了检查我是否正确填充了它们。

1: select * from orders- 在 SQL fiddle(或 IBExpert、FlameRobin 等)中尝试此操作和进一步查询

2: select * from orderDetails

3:然后我发出连接查询来检查我的跨表查询是否确实给出了有意义的输出。它做了。

select o.modified, od.* 
from orderDetails od, orders o
where o.id=od.order_id

4:然后我想知道,我可以从该查询中获取详细信息的最后一个时间戳吗?为了检查它,我做了以下操作:1)保存了我之前所做并测试的上述查询,2)在其之上编写了一个辅助查询。它确实提取了最后的更改日期。已编写并经过测试。

with x as (select o.modified, od.* 
           from orderDetails od, orders o
           where o.id=od.order_id)
Select max(modified) as modified, detail_id
  from x group by detail_id

5:最后一步也是保存测试二级查询,并在它们之上编写最终的第三级查询,给出最终的过滤数据


然而,更有效的解决方案可以使用一次性连接查询(我在上面介绍的一个)Step 3.并另存为x)并添加order by detail_id, modified desc然后使用窗口函数Firebird 3 中引入。

这是使用该方法对类似问题的答案 -Firebird 从表中选择不同的一个字段

不过,窗口函数在 Firebird 2.x 中不可用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅选择具有上次修改时间戳的行,不选择具有相同 ID 和旧时间戳的重复行 的相关文章

  • SQL - != 'NULL' 的解释

    我的SSMS代码如下 Select top 50 From FilteredContact Where statuscode 1 and emailaddress1 NULL and telephone1 NULL and address1
  • 在 Oracle 行的多个列上使用透视

    我在 Oracle 表中有以下示例数据 tab1 我正在尝试将行转换为列 我知道如何在某一列上使用 Oracle 数据透视表 但是否可以将其应用于多个列 样本数据 Type weight height A 50 10 A 60 12 B 4
  • 优化 SQL Server 上的删除

    Deletesql server 上的有时很慢 我经常需要优化它们以减少所需的时间 我一直在谷歌上搜索一些关于如何做到这一点的提示 并且我发现了各种各样的建议 我想知道你最喜欢和最有效的驯服删除野兽的技术 以及它们如何以及为什么起作用 到目
  • java ResultSet,使用MAX sql函数

    你好 这就是我想要的 我连接到数据库并检索 UniqueId 列的最大元素 并将其分配给名为 maxID 的整数变量 这是我的方法 int maxID 0 Statement s2 con createStatement s2 execut
  • 给定“java.sql.SQLIntegrityConstraintViolationException”是否可以确定错误的列

    鉴于我有一个类型为 java sql SQLIntegrityConstraintViolationException 的异常 是否可以以编程方式确定错误的列 或多列 我问这个问题是因为我想将错误映射回客户端的数据模型以指示错误的字段 例如
  • 将 .MDF SQL Server 数据库与 ASP.NET 结合使用与使用 SQL Server

    我目前正在 ASP NET MVC 中编写一个网站 我的数据库 其中还没有任何数据 只有正确的表 使用 SQL Server 2008 我已将其安装在我的开发计算机上 我使用服务器资源管理器从应用程序连接到数据库 然后使用 LINQ to
  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • Oracle:如何获取刚刚插入的行的序列号?

    如何获取刚刚插入的行的序列号 插入 返回 declare s2 number begin insert into seqtest2 x values aaa returning seq into s2 dbms output put lin
  • 加密数据库字段的好方法?

    我被要求加密数据库中的各种数据库字段 问题是这些字段在读取后需要解密 我在用着Django and SQL Server 2005 有什么好主意吗 See 在 SQL Server 2005 数据库中使用对称加密 https web arc
  • SQL 2008全文索引填充延迟

    我的经理说 在基础表数据更改后 可能需要一段时间才能更新全文搜索索引 例如 如果我有一张桌子Products有一个柱子Description我更新了该描述 然后我可能需要一些时间才能搜索该新描述 真的吗 这需要多长时间 SQL 2008 对
  • Reporting Services 在哪里存储其日志文件

    最相关的谷歌结果似乎表明 为了访问日志 我们必须将您自己的日志表部署到数据库并制作报告服务写入它 http technet microsoft com en us library ms157403 aspx 简而言之 Reporting S
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 如何在 DB2 中创建返回序列值的函数?

    如何在 DB2 中创建一个从序列中获取值并返回该值的函数 应该可以在 select 或 insert 语句中使用该函数 例如 select my func from xxx insert into xxx values my func 基本
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • 如何使用 BigQuery 有效地选择另一个表中匹配子字符串的记录?

    我有一个包含数百万个字符串的表 我想将其与包含大约两万个字符串的表进行匹配 如下所示 standardSQL SELECT record FROM record JOIN fragment ON record name LIKE CONCA
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe

随机推荐

  • C# SMO - 将表数据编写到文件中。投掷错误

    在重新创建表之前 我尝试创建数据库中包含的数据的备份 我已经连接到服务器并创建文件来存储 SQL 问题是它在最后一行抛出错误 你调用的对象是空的 我一整天都在这个项目上 所以可能会错过一些新的眼睛会有所帮助的东西 这是代码 public v
  • 在父元素和子元素之间绑定一个值,其中子元素是使用 javascript 创建的

    使用 Polymer 有人知道如何在父元素和子元素之间绑定值吗 以下是我的尝试 但它不起作用 Note child component需要使用 JavaScript 创建
  • 获取窗口截图 Windows API

    我正在尝试制作一个在现有 GUI 之上工作的程序来对其进行注释并提供额外的计算和统计信息 我想使用图像识别来做到这一点 因为我在大学里使用 Matlab 和类似的东西学到了很多这方面的知识 我可以获得要执行图像识别的窗口的句柄 但我不知道如
  • 为什么两个不同的数组文字在 Swift 中彼此相等?

    为什么表达 import Foundation a b c c b a 评估为true在 Swift 游乐场 当未导入 Foundation 时 该表达式的计算结果为 false 乔什的答案很接近 但并不完全正确 按住 Option 键并单
  • SQL Server 表可以有两个标识列吗?

    我需要将一列作为主键 另一列作为自动递增订单号字段 这可能吗 编辑 我想我只会使用复合数作为订单号 不管怎么说 多谢拉 CREATE TABLE dbo Foo FooId int IDENTITY 1 1 NOT NULL BarId i
  • 带参数的图像 - HTML

    我不知道如何提出这个问题 我不知道下面的标签是如何工作的 img src img png value 23 这个标签工作正常 并且它正确地渲染了图像 是否value 23有效果吗 或者它被浏览器忽略了 我什至不知道如何谷歌这个 就像向图像传
  • 为什么 System.Windows.Controls.Button 的内边距始终为 10px?

    请参阅屏幕截图 青色边框框是按钮 蓝色填充是矩形 我一生都无法弄清楚如何摆脱按钮中的填充 有没有办法将矩形放置在左上角 使其接触青色边框 Thanks 您是否尝试过设置Rectangle的边际为0
  • 初始加载屏幕上的角度冻结 SVG 动画

    我想在浏览器加载 Angular 5 的脚本和其他资源时播放动画 例如这个 SVG 动画
  • 您必须在实例化此 ParseObject 子类之前注册它

    我在我的中收到以下错误Android应用程序使用Parse You must register this ParseObject subclass before instantiating it In my Application对象 我正
  • Neo4j 在浏览器图形视图中仅显示特定关系

    我有这个密码查询 MATCH i Issue name SN 229 d ON DATE gt s Stage RETURN i MAX d long MIN d long 1 AS Days s and I get these resul
  • 未显示 Toast 消息

    我试图使用以下代码在我的应用程序中显示一条 toast 消息 AlertDialog Builder alert new AlertDialog Builder this alert setTitle Do you want to cont
  • Java类实例递归调用

    我有一个非常基本的java理论问题 为什么 Employee 类在下面的示例中递归地调用其自身 class Employee Employee emp new Employee public class Manager extends Em
  • 阿帕奇 POI 和颜色

    我在使用 Apache POI 时遇到一些问题 如果能得到一些帮助就好了 我想删除 Excel 工作表子部分中的颜色 为此 我尝试的第一件事是渲染我想要清理的单元格 假设仅第一行的单元格 并将其颜色设置为白色 cell getCellSty
  • 识别 Sublime Text 3 代码片段源

    有谁知道如何识别 Sublime Text 3 代码片段的来源 有一个用于 Rails 的 我认为它来自某个包 我已经卸载了该软件包 但该代码片段仍然可以使用 这让我发疯 Press Ctrl Backtick to open the co
  • 如何编写迭代器?

    我有一个节点网络 在节点之间传递结构化数据 对于我的子问题 我们有这个分支 节点的线性序列 nodes source n1 n2 n3 n4 第一个节点是生成器 每个其他节点从输入节点获取值并提供输出值 当前的实现是从管道的普通 get 和
  • jQuery onmouseover + onmouseout / 悬停在两个不同的 div 上

    我有一个问题 这是我的 HTML 的一部分 div Here Hover div div Here content to show div 这是我的 jQuery 脚本的一部分 jQuery div 2 hide jQuery div 1
  • 如何使用 vegas.js 插件添加文本动画

    我正在使用 vegas js 插件 http vegas jaysalvat com documentation 对于我的网站 我想用这些图像显示一些文本 我如何添加一些带有图像的动画文本 在 body 中初始化 vegas js
  • Flask url_for 在模板的外部 JavaScript 中不起作用

    在index html 中 我链接到index js 文件 单击一个按钮 js 会向 Flask 后端发送请求 后端返回静态文件路径 data Sharon 4 png 我想使用以下函数以 HTML 形式呈现它 但它不起作用 为了简化它 我
  • 将代码直接放在InitializeComponent 之后是不好的做法吗?

    我只是想知道一件事 我有一个加载页面的框架 当前每个页面都有一个Page Loaded每次访问页面时都会运行的方法 这工作得很好 但如果我使用导航转到以前访问过的页面 我会注意到错误 返回页面后 Page Loaded我不希望再次被呼叫 使
  • 仅选择具有上次修改时间戳的行,不选择具有相同 ID 和旧时间戳的重复行

    我找不到解决我的问题的方法 我有两个表 Order 和 OrderDetail 订单表 简单版 ID modified 1 7 1 2018 2 10 1 2018 3 15 1 2018 4 20 1 2018 5 25 1 2018 订