sql select 没有子查询的具有最大日期(小于特定日期)的所有内容
sql select everything with maximum date (that that is smaller than a specific date) without subqueries
我想编写一个 sql 查询,其中我选择按 id
分组的所有行,其中 date
列是此 id
的最新日期,但仍然小于例如 16-JUL-2021。我想在不使用子查询(在 oracle 中)的情况下执行此操作,这可能吗?
我尝试了以下但它不起作用。
SELECT *, max(date)
WHERE date < '16-JUL-2021'
OVER(PARTITION BY id ORDER BY date DESC) as sth
FROM table
没有sub-queries也能找到最大日期。
SELECT t.*,
max("DATE") OVER(PARTITION BY id ORDER BY "DATE" DESC) as max_date
FROM "TABLE" t
WHERE "DATE" < DATE '2021-07-16'
您需要 sub-query 进行过滤以仅显示具有最大日期的行:
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;
但是,即使它使用 sub-query.
,您仍然只使用此技术查询一次 table
注意DATE
和TABLE
是保留字,不能用作不带引号的标识符;最好为这些标识符使用不同的名称。
您可以等效地使用 RANK
或 DENSE_RANK
解析函数而不是 MAX
;但是,ROW_NUMBER
不会给出相同的输出,因为它只会 return 一行,不会 return 所有并列的行。
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;
但是您仍然需要 sub-query 来过滤行。
如果你不想使用 sub-query 那么你可以使用:
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 获取一行,并且不会 return 多个行与每个 ID 的最大日期相关联。
我想编写一个 sql 查询,其中我选择按 id
分组的所有行,其中 date
列是此 id
的最新日期,但仍然小于例如 16-JUL-2021。我想在不使用子查询(在 oracle 中)的情况下执行此操作,这可能吗?
我尝试了以下但它不起作用。
SELECT *, max(date)
WHERE date < '16-JUL-2021'
OVER(PARTITION BY id ORDER BY date DESC) as sth
FROM table
没有sub-queries也能找到最大日期。
SELECT t.*,
max("DATE") OVER(PARTITION BY id ORDER BY "DATE" DESC) as max_date
FROM "TABLE" t
WHERE "DATE" < DATE '2021-07-16'
您需要 sub-query 进行过滤以仅显示具有最大日期的行:
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;
但是,即使它使用 sub-query.
,您仍然只使用此技术查询一次 table注意DATE
和TABLE
是保留字,不能用作不带引号的标识符;最好为这些标识符使用不同的名称。
您可以等效地使用 RANK
或 DENSE_RANK
解析函数而不是 MAX
;但是,ROW_NUMBER
不会给出相同的输出,因为它只会 return 一行,不会 return 所有并列的行。
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;
但是您仍然需要 sub-query 来过滤行。
如果你不想使用 sub-query 那么你可以使用:
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 获取一行,并且不会 return 多个行与每个 ID 的最大日期相关联。