Запрос PostgreSQL с условно пустыми значениями в зависимости от предыдущих строк - PullRequest
0 голосов
/ 27 февраля 2012

Я работаю над запросом postgresql, но я не уверен, как получить вывод.

Допустим, у меня есть SQL-запрос, вывод которого мне нужен

         name    date     visit_number  visit
          x    2011-01-01     123         ??   (value i want=1)
          y    2011-01-01     123         ??   (value i want=empty)
          a    2011-02-02     345         ??   (value i want=1) 
          b    2011-02-02     345         ??    (empty)
          c    2011-02-02     345         ??     (empty)

в настоящее время мойSQL-запрос содержит все значения, кроме последнего посещения столбца.Я хочу, чтобы столбец посещений работал таким образом ... если параметр visit_number содержит одно и то же значение для нескольких строк, я хочу, чтобы посещение столбца показывало значение 1 для первой строки и просто ноль или пусто для оставшихся строк, где значение visit_number одинаково,Как мне это сделать ???

Я мог бы написать пример запроса любым способом. Это могло бы быть просто:

    select name,date,visit_number from sometable order by date;

Я использую версию Postgres 8.1.

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 февраля 2012

Это запрос:

select *, 
  case when row_number() over (partition by visit_number) = 1
    then 1
    else null
  end
from t

Вот пример

Редактировать:

Без оконной функции:

select t4.*, case when t3.name is not null then 1 end as visit from t t4
left join (
  select t1.* from t t1
  left join t t2 on t1.name > t2.name and t1.date = t2.date and 
    t1.visit_number = t2.visit_number
  where t2.name is null
) as t3
on t3.name = t4.name and t3.date = t4.date and t3.visit_number = t4.visit_number

Вот пример

ПРИМЕЧАНИЕ. Если name является ключом, то последнее сравнение t3.date = t4.date and t3.visit_number = t4.visit_number может быть удалено

0 голосов
/ 27 февраля 2012

Первое, что вы должны сделать, это обновить до современной версии PostgreSQL. Версия 8.1 достигла конца срока службы в ноябре 2010 года .

В более поздней версии вы можете легко решить эту проблему с помощью оконных функций :

SELECT name, date, visit_number
     , CASE WHEN row_number() OVER (PARTITION BY visit_number
                                    ORDER BY date, name) = 1
          THEN 1
          ELSE NULL
       END AS visit
FROM   tbl
ORDER  BY date, name;

Я приказал по имени дополнительно разорвать связи.


Для версий до PostgreSQL 8.4 этот запрос должен работать (не проверено):

SELECT name, date, visit_number
     , CASE WHEN EXISTS (
         SELECT *
         FROM   tbl t1
         WHERE  t1.visit_number =  tbl.visit_number -- more to make it unique?
         AND    t1.date <= tbl.date -- or more columns to make order unambiguous
         AND    t1.name <  tbl.name
         )
       THEN NULL ELSE 1 END AS visit
FROM   tbl
ORDER  BY date, name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...