如何在 Oracle 10g 中获取不在 GROUP BY 子句中的其他列?
How to get other columns with are not in GROUP BY clause in Oracle 10g?
我正在输入 SELECT 语句来检索每个客户第一次出现在销售收据历史记录中的信息,我有以下语句来检索有关 client_id 和 [=22 的信息=] 日期,但我需要 sales_receipt_id 每张收据。你能帮助我吗?谢谢!
我正在使用 Toad for Oracle 9.7.2.5 中连接的 Oracle 数据库 10G。
SELECT cli_codigo AS client_id, MIN(cmp_fecha_contable) AS sales_receipt_date
FROM comprobantes
WHERE cli_codigo IS NOT NULL
GROUP BY cli_codigo
ORDER BY cli_codigo ASC;
这句话实际上我们 运行 很好,但我也需要 receipt_id。 (所有列都在同一个 table 中,名为 "comprobantes"。
我期望输出:
RECEIPT_ID CLIENT_ID RECEIPT_DATE
201203000174 061 3/19/2012
201203000027 118 3/19/2012
201203000028 166 3/19/2012
201203000029 139 3/19/2012
201203000031 055 3/19/2012
select comprobantes.*
from comprobantes
left join
(
SELECT cli_codigo AS client_id, MIN(cmp_fecha_contable) AS sales_receipt_date
FROM comprobantes
WHERE cli_codigo IS NOT NULL
GROUP BY cli_codigo
ORDER BY cli_codigo ASC
) a on a.client_id = comprobantes.cli_codigo and comprobantes.cmp_fecha_contable = a.sales_receipt_date
列必须在分组依据或聚合函数中。
所以你可以这样做:
SELECT cli_codigo AS client_id, MIN(cmp_fecha_contable) AS sales_receipt_date, min(RECEIPT_ID)
FROM comprobantes
WHERE cli_codigo IS NOT NULL
GROUP BY cli_codigo
ORDER BY cli_codigo ASC
或者
SELECT cli_codigo AS client_id, MIN(cmp_fecha_contable) AS sales_receipt_date, RECEIPT_ID
FROM comprobantes
WHERE cli_codigo IS NOT NULL
GROUP BY cli_codigo, RECEIPT_ID
ORDER BY cli_codigo ASC;
您可以使用 keep
:
SELECT cli_codigo AS client_id,
MIN(cmp_fecha_contable) AS sales_receipt_date,
MIN(receipt_id) KEEP (DENSE_RANK FIRST ORDER BY cmp_fecha_contable) as first_receipt_id
FROM comprobantes
WHERE cli_codigo IS NOT NULL
GROUP BY cli_codigo
ORDER BY cli_codigo ASC;
这本质上是一个聚合 first_value()
函数。虽然语法有点笨拙,但 keep
在聚合查询中是一个非常强大的结构。
我正在输入 SELECT 语句来检索每个客户第一次出现在销售收据历史记录中的信息,我有以下语句来检索有关 client_id 和 [=22 的信息=] 日期,但我需要 sales_receipt_id 每张收据。你能帮助我吗?谢谢!
我正在使用 Toad for Oracle 9.7.2.5 中连接的 Oracle 数据库 10G。
SELECT cli_codigo AS client_id, MIN(cmp_fecha_contable) AS sales_receipt_date
FROM comprobantes
WHERE cli_codigo IS NOT NULL
GROUP BY cli_codigo
ORDER BY cli_codigo ASC;
这句话实际上我们 运行 很好,但我也需要 receipt_id。 (所有列都在同一个 table 中,名为 "comprobantes"。
我期望输出:
RECEIPT_ID CLIENT_ID RECEIPT_DATE
201203000174 061 3/19/2012
201203000027 118 3/19/2012
201203000028 166 3/19/2012
201203000029 139 3/19/2012
201203000031 055 3/19/2012
select comprobantes.*
from comprobantes
left join
(
SELECT cli_codigo AS client_id, MIN(cmp_fecha_contable) AS sales_receipt_date
FROM comprobantes
WHERE cli_codigo IS NOT NULL
GROUP BY cli_codigo
ORDER BY cli_codigo ASC
) a on a.client_id = comprobantes.cli_codigo and comprobantes.cmp_fecha_contable = a.sales_receipt_date
列必须在分组依据或聚合函数中。 所以你可以这样做:
SELECT cli_codigo AS client_id, MIN(cmp_fecha_contable) AS sales_receipt_date, min(RECEIPT_ID)
FROM comprobantes
WHERE cli_codigo IS NOT NULL
GROUP BY cli_codigo
ORDER BY cli_codigo ASC
或者
SELECT cli_codigo AS client_id, MIN(cmp_fecha_contable) AS sales_receipt_date, RECEIPT_ID
FROM comprobantes
WHERE cli_codigo IS NOT NULL
GROUP BY cli_codigo, RECEIPT_ID
ORDER BY cli_codigo ASC;
您可以使用 keep
:
SELECT cli_codigo AS client_id,
MIN(cmp_fecha_contable) AS sales_receipt_date,
MIN(receipt_id) KEEP (DENSE_RANK FIRST ORDER BY cmp_fecha_contable) as first_receipt_id
FROM comprobantes
WHERE cli_codigo IS NOT NULL
GROUP BY cli_codigo
ORDER BY cli_codigo ASC;
这本质上是一个聚合 first_value()
函数。虽然语法有点笨拙,但 keep
在聚合查询中是一个非常强大的结构。