Как получить другие столбцы, не входящие в предложение GROUP BY в Oracle 10g? - PullRequest
1 голос
/ 09 апреля 2019

Я набираю оператор SELECT, чтобы получить информацию о том, что каждый клиент впервые появился в истории продаж, у меня есть следующий оператор, который извлекает информацию о client_id и sales_receipt date, но мне нужен sales_receipt_id для каждой квитанции. Вы можете мне помочь? Спасибо!

Я использую Oracle Database 10G, подключенную в Toad для Oracle 9.7.2.5.

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;

Это утверждение на самом деле у нас работает хорошо, но мне тоже нужен receive_id. (Все столбцы находятся в одной таблице с именем "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

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Вы можете использовать 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 является очень мощной конструкцией в запросах агрегации.

0 голосов
/ 09 апреля 2019

Столбец должен быть в группе или в функции агрегирования. Так что вы можете сделать:

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;
0 голосов
/ 09 апреля 2019
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
...