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

Oracle SQL查询:根据时间检索每个组的最新值

袁鸿畅
2023-03-14
问题内容

我在Oracle数据库中有下表

id     date              quantity
1      2010-01-04 11:00  152
2      2010-01-04 11:00  210
1      2010-01-04 10:45  132
2      2010-01-04 10:45  318
4      2010-01-04 10:45  122
1      2010-01-04 10:30  1
3      2010-01-04 10:30  214
2      2010-01-04 10:30  5515
4      2010-01-04 10:30  210

现在,我想检索每个ID的最新值(及其时间)。输出示例

id     date              quantity
1      2010-01-04 11:00  152
2      2010-01-04 11:00  210
3      2010-01-04 10:30  214
4      2010-01-04 10:45  122

我只是不知道如何将其放入查询…

此外,以下选项将是不错的选择:

选项1:查询应仅返回最近XX分钟的值。

选项2:应将id与另一个具有id和idname的表中的文本连接起来。id的输出应类似于:id-idname(例如1-testid1)。

非常感谢您的帮助!


问题答案:

给定此数据…

SQL> select * from qtys
  2  /

        ID TS                      QTY
---------- ---------------- ----------
         1 2010-01-04 11:00        152
         2 2010-01-04 11:00        210
         1 2010-01-04 10:45        132
         2 2010-01-04 10:45        318
         4 2010-01-04 10:45        122
         1 2010-01-04 10:30          1
         3 2010-01-04 10:30        214
         2 2010-01-04 10:30       5515
         4 2010-01-04 10:30        210

9 rows selected.

SQL>

…以下查询给出了您想要的…

SQL> select x.id
  2         , x.ts as "DATE"
  3         , x.qty as "QUANTITY"
  4  from (
  5      select id
  6             , ts
  7             , rank () over (partition by id order by ts desc) as rnk
  8             , qty
  9      from qtys ) x
 10  where x.rnk = 1
 11  /

        ID DATE               QUANTITY
---------- ---------------- ----------
         1 2010-01-04 11:00        152
         2 2010-01-04 11:00        210
         3 2010-01-04 10:30        214
         4 2010-01-04 10:45        122

SQL>

关于您的其他要求,您可以将其他过滤器应用于外部WHERE子句。同样,您可以将其他表联接到内联视图,就像其他任何表一样。



 类似资料:
  • 问题内容: 我在Postgres 9.2中有以下用于用户消息(简化形式)的日志表: 每个用户每天最多包含一条记录。在300天之内,每天大约有50万条记录。每个用户的有效负载都在增加(如果很重要)。 我想有效地检索每个用户在特定日期之前的最新记录。我的查询是: 这非常慢。我也尝试过: 具有相同的计划,并且速度同样慢。 到目前为止,我在上只有一个索引,但并没有太大帮助。 我有一个包含所有用户的表。我还

  • 问题内容: 如果我有一个具有以下结构和数据的表: 我将使用哪种查询来获得以下结果(随后的说明): 如你看到的: 每个仅返回一行。 最高的那一行是返回的那一行。 是否有一种 无需 使用子查询即可完成此操作的方法?该程序经过的关系代数术语中是否有名称? 问题答案: 该查询称为逐组最大值,它(至少在MySQL中)可以通过子查询实现。例如: 在sqlfiddle上看到它。

  • 问题内容: 我有此数据: 代码(对于SQL Server 2005): 我想为每个名称获取具有最新DATE的ID。像这样: 实现此目的最优雅的方法是什么? 问题答案: 尽量避免使用保留字(和模糊的列名),例如…

  • 问题内容: 我有这张表 language_id是指记录所用的语言。我想做的是检索 每个language_id中 最近的五个记录(ORDER BY time_posted DESC LIMIT 5)的列表。我可以使用许多不同的SQL查询在PHP中循环执行此操作,但我觉得有一种更简单的方法。 我必须得到一本有关SQL的书,哈哈。 谢谢。 问题答案: 这是我在MySQL中解决此“每组前N个”类型的查询的

  • 问题内容: 我正在尝试测试从Excel数据连接运行的查询的三种变体。 我有三个单独的数据连接和三个单独的选项卡,它们分别从每个连接获取数据。 每个查询的连接字符串相同,只有命令文本(Oracle SQL)不同。 Excel中是否可以查看每个查询的执行时间? 我专门使用版本 问题答案: 可能是这样的事情(假设所有连接都将其结果放置在工作表中,而不是在数据透视表中): 要运行此命令: +转到VBA编辑

  • 问题内容: 可以说我有2个表:blog_posts和类别。每个博客帖子仅属于一个类别,因此此处的两个表之间基本上有一个外键。 我想从每个类别中检索2个最新的帖子,是否可以在单个请求中实现?GROUP BY会将所有内容分组,而在每个类别中只剩下一行。但我要其中两个。 执行1 + N查询(N =类别数)会很容易。首先检索类别。然后从每个类别检索2个帖子。 我相信执行M个查询(M =我希望从每个类别获得