首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sql选择所有具有最大日期(即小于特定日期)的无子查询的内容。

sql选择所有具有最大日期(即小于特定日期)的无子查询的内容。
EN

Stack Overflow用户
提问于 2022-02-11 09:47:46
回答 1查看 1.1K关注 0票数 0

我想编写一个sql查询,在其中我选择按id分组的所有行,其中列date是该id的最新日期,但仍然小于例如16-JL-2021。我想在不使用子查询(在oracle中)的情况下这样做,这可能吗?我试了下,但不起作用。

代码语言:javascript
运行
复制
SELECT *, max(date) 
WHERE date < '16-JUL-2021'
OVER(PARTITION BY id ORDER BY date DESC) as sth
FROM table
EN

Stack Overflow用户

回答已采纳

发布于 2022-02-11 09:54:07

您可以在没有子查询的情况下找到最大日期。

代码语言:javascript
运行
复制
SELECT t.*,
       max("DATE") OVER(PARTITION BY id ORDER BY "DATE" DESC) as max_date
FROM   "TABLE" t
WHERE  "DATE" < DATE '2021-07-16'

您需要一个子查询来筛选,以只显示具有最大日期的行:

代码语言:javascript
运行
复制
SELECT *
FROM   (
  SELECT t.*,
         max("DATE") OVER(PARTITION BY id ORDER BY "DATE" DESC) as max_date
  FROM   "TABLE" t
  WHERE  "DATE" < DATE '2021-07-16'
)
WHERE  "DATE" = max_date;

但是,即使使用子查询,您仍然只使用此技术查询一次表。

注意:DATETABLE是保留词,不能用作未引号标识符;更好的做法是为这些标识符使用不同的名称。

您可以等效地使用RANKDENSE_RANK解析函数而不是MAX;但是,ROW_NUMBER不会提供相同的输出,因为它只返回一行,并且不会返回所有绑定行。

代码语言:javascript
运行
复制
SELECT *
FROM   (
  SELECT t.*,
         RANK() OVER(PARTITION BY id ORDER BY "DATE" DESC) as rnk
  FROM   "TABLE" t
  WHERE  "DATE" < DATE '2021-07-16'
)
WHERE  rnk = 1;

但是,您仍然需要一个子查询来过滤行。

如果不使用子查询,则可以使用:

代码语言:javascript
运行
复制
SELECT id,
       MAX("DATE") AS "DATE",
       MAX(col1) KEEP (DENSE_RANK LAST ORDER BY "DATE", ROWNUM) AS col1,
       MAX(col2) KEEP (DENSE_RANK LAST ORDER BY "DATE", ROWNUM) AS col2,
       MAX(col3) KEEP (DENSE_RANK LAST ORDER BY "DATE", ROWNUM) AS col3
FROM   "TABLE"
GROUP BY id

但是,这并不完全相同,因为它将只获得每个id一个行,并且不会返回与每个id的最大日期绑定的多行。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71078018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档