Я набираю оператор SELECT, чтобы получить информацию о том, что каждый клиент впервые появился в истории чеков о продажах. У меня есть следующий оператор, который извлекает информацию о client_id и дате sales_receipt, но мне нужен 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;
Этот оператор на самом деле работает хорошо, но мне также нужен Recit_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
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
— очень мощная конструкция в запросах агрегации.
Спасибо за помощь! Работает нормально, буду читать про функцию "держать"!
Покажите нам некоторые примеры данных таблицы и ожидаемый результат — все в виде форматированного текста, а не изображений. И взгляните на stackoverflow.com/help/mcve.