Как получить записи из таблицы на основе условий

#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:

Создайте представление, которое возвращает все вставленные значения в порядке убывания. Затем выберите первую или вторую строку в соответствии с условием.