Выберите первое значение, затем заполните значение null для уникального идентификатора

#sql #postgresql

Вопрос:

Я использую базу данных Postgres.

Я пытался решить эту проблему в течение нескольких часов и прочитал десятки тем, но пока безрезультатно

Поскольку я не знаю, как объяснить свою проблему словами, вот что мне нужно на примере :

Мой вопрос таков

 select distinct chiffre_affaires.contrat_pentete_id,  chiffre_affaires.chiffre_affaires_id,  chiffre_affaires.chiffre_affaires_montant_total from chiffre_affaires;  

Выходной ток :

contrat_pentete_id chiffre_affaire_id chiffre_affairs_montant_total
1 1 111.7848
1 2 111.7848
1 3 111.7848
1 4 111.7848
1 5 111.7848
1 6 111.7848
2 7 90
2 8 90
2 9 90
2 10 90

Ожидаемый результат :

значения null могут быть заменены на 0, подойдет как null, так и 0

contrat_pentete_id chiffre_affaire_id chiffre_affairs_montant_total
1 1 111.7848
1 2 нулевой
1 3 нулевой
1 4 нулевой
1 5 нулевой
1 6 нулевой
2 7 90
2 8 нулевой
2 9 нулевой
2 10 нулевой

Заранее благодарю вас за любую помощь !

Ответ №1:

Пытаясь понять, чего вы хотите достичь : для группы строк с одинаковым идентификатором contrat_pentete_id, упорядоченных по ASC chiffre_affaires_id, вы хотите отобразить значение chiffre_affaires_montant_total для первой строки и значение NULL для следующих строк. Если это так, вы можете попробовать это :

 SELECT DISTINCT   ca.contrat_pentete_id,  ca.chiffre_affaires_id,  CASE  WHEN ca.chiffre_affaires_id = first_value (ca.chiffre_affaires_id) OVER (ORDER BY ca.chiffre_affaires_id)  THEN ca.chiffre_affaires_montant_total  ELSE NULL  END AS ca.chiffre_affaires_montant_total FROM chiffre_affaires AS ca ORDER BY ca.contrat_pentete_id, ca.chiffre_affaires_id  

Комментарии:

1. Большое вам спасибо, после некоторых обновлений на основе вашего сценария я получил то, что мне было нужно !

2. Спасибо, что приняли ответ, чтобы закрыть вопрос.

Ответ №2:

Благодаря Эдуарду Х. Наконец — то я написал сценарий, который выполнил свою работу.

Вот решение :

 SELECT DISTINCT ca.contrat_pentete_id,  ca.chiffre_affaires_id,  ca.chiffre_affaires_annee_mois,  CASE  WHEN ca.chiffre_affaires_id =  first_value(ca.chiffre_affaires_id) OVER (PARTITION BY ca.contrat_pentete_id ORDER BY ca.chiffre_affaires_annee_mois)  THEN ca.chiffre_affaires_montant_total  END AS montant_facture FROM chiffre_affaires AS ca ORDER BY ca.contrat_pentete_id;