#sql #amazon-redshift
#sql #amazon-redshift
Вопрос:
Выберите только последнюю сумму, если null, то перед этим.
таблица a
customer|amount|date
001|2 |20201101
001|null|20201102
001|3 |20201103
002|8.9 |20201101
002|7 |20201008
002|null|20201106
Результат
001|null|20201101
001|null|20201102
001|3 |20201103
002|null|20201101
002|null|20201008
002|7 |20201106
данные суммы должны быть взяты последними по дате, другая запись будет нулевой, если сумма равна нулю для последней даты, она должна принимать предыдущее значение not null.
Моя текущая попытка:
select top 1 [amount]
from table
where [amount] is not null
order by date desc
Комментарии:
1. Какой продукт СУБД вы используете — вы отметили три очень разных продукта базы данных?
2. и что вы пробовали до сих пор?
3. В настоящее время я использую redhift
4. выберите top 1 [сумма] из таблицы, где customer_code=’001′, а [сумма] не равна нулю порядок по дате desc
5. @Rupesh Я думаю, вам нужно быть более конкретным в своем вопросе. Вы хотите отфильтровать строки или заполнить столбец суммы на основе условия? В вашем примере сумма 2 отображается как null, потому что это не последняя сумма?
Ответ №1:
Если вы хотите установить все, кроме самого последнего значения, в NULL
:
select customer_code, date,
(case when seqnum = 1 then amount end) as amount
from (select t.*,
row_number() over (partition by customer_code order by (amount is not null) desc, date desc) as seqnum
from table t
) t
where customer_code = '001'
order by date desc
Ответ №2:
Вероятно, то, что вы ищете, — это оконная функция:
SELECT *
FROM (SELECT *,
row_number() over
(partition by customer
order by amount desc, date desc) as rn
FROM your_table
WHERE amount is not null)
WHERE rn = 1
Вы можете использовать row_number или dense_rank в зависимости от ваших потребностей
Ответ №3:
Создайте представление, которое возвращает все вставленные значения в порядке убывания. Затем выберите первую или вторую строку в соответствии с условием.