подружить DISTINCT с агрегатором

Electric200
Дата: 09.02.2015 18:23:55
Добрый день уважаемые. В общем подскажите что я не так делаю.. Есть подзапрос
    (
                    SELECT DISTINCT ON ("OPID") "OPID", 
                           odp_agr(ARRAY[ARRAY[CAST("OPID" AS text),CAST("OPVALUE" AS text)]]) AS oparray                    
                    FROM "2343_ODP"  WHERE "2343_ODP"."DATE"="2343_GDP"."DATE" 
                    AND "2343_ODP"."DATE">='2015-02-07 18:36:01'
                    AND "2343_ODP"."DATE"<'2015-02-09 13:20:07' 
                  )

Т.е в odp_agr сейчас попадают несколько значений с одинаковым "OPID":
{{"120","300"},{"121","300"},{"120","300"},{"123","300"}}

А мне необходимо либо сгруппировать либо исключить повторы.
А в таком виде как я привел пример, получаю ошибку:
ОШИБКА:  колонка "2343_ODP.OPID" должна фигурировать в предложении GROUP BY или использоваться в агрегатной функции

Почему планировщик, при использовании в обычном запросе, понимает что необходимо выбросить "дубляжи" без каких либо группировок, а тут чего то хочет от меня? Пусть также выбросит, а что останется передаст в агрегатор.
В общем, я запутался.
поправил
Дата: 09.02.2015 18:38:01
Electric200
    ( 
                    SELECT --DISTINCT ON ("OPID") uyfreq gmzys[ gj[,nbcnjd
                           "OPID", 
                           odp_agr(ARRAY[ARRAY[CAST("OPID" AS text),CAST("OPVALUE" AS text)]]) AS oparray                    
                    FROM "2343_ODP"  WHERE "2343_ODP"."DATE"="2343_GDP"."DATE" 
                    AND "2343_ODP"."DATE">='2015-02-07 18:36:01'
                    AND "2343_ODP"."DATE"<'2015-02-09 13:20:07' 

                    GROUP BY "OPID"
                  )

Electric200
Дата: 09.02.2015 19:09:52
поправил,

Конечно, но в таком случае возвращает несколько строк.. А мне необходимо одну. Собственно весь запрос:

SELECT
                  DISTINCT ON ( "2343_GDP"."DATE") "2343_GDP"."DATE", 
                  hstore("2343_GDP".*),
                  "2343_GDP"."POINTXY"[0] AS "POINTX",
                  EXTRACT (EPOCH FROM "2343_GDP"."DATE")          AS "DATEGPS_UNIX",
                  EXTRACT (EPOCH FROM "2343_GDP"."DATETRANS")  AS "DATETRANS_UNIX",
                  "2343_GDP"."POINTXY"[1] AS "POINTY",
                  (
                    SELECT  odp_agr(ARRAY[ARRAY[CAST("OPID" AS text),CAST("OPVALUE" AS text)]]) AS oparray FROM                
                    "2343_ODP"  WHERE "2343_ODP"."DATE"="2343_GDP"."DATE" 
                    AND "2343_ODP"."DATE">='2015-02-07 18:36:01'
                    AND "2343_ODP"."DATE"<'2015-02-09 13:20:07' 
                  )
                  FROM "2343_GDP" 
                  WHERE "2343_GDP"."DATE">='2015-02-07 18:36:01' AND "2343_GDP"."DATE"<'2015-02-09 13:20:07'
                  ORDER BY  "2343_GDP"."DATE" ASC;
/\/\/\/\/\/\
Дата: 09.02.2015 19:53:17
Electric200,

Значит нужно сперва выбрать данные, затем исключить дубликаты и только потом агрегировать.
Как-то так:

SELECT
  odp_agr(ARRAY[ARRAY[f1, f2]]) AS oparray
FROM ( 
SELECT DISTINCT
  CAST("OPID" AS text) AS f1,
  CAST("OPVALUE" AS text) AS f2 
FROM "2343_ODP"  
WHERE "2343_ODP"."DATE"="2343_GDP"."DATE" 
  AND "2343_ODP"."DATE">='2015-02-07 18:36:01'
  AND "2343_ODP"."DATE"<'2015-02-09 13:20:07' ) t
поправил
Дата: 09.02.2015 20:56:52
Electric200
поправил,

Конечно, но в таком случае возвращает несколько строк.. А мне необходимо одну. Собственно весь запрос:
<>
и что вам не нравится в вашем запросе ?

простите телепаты в отпуске, хрустальный шар давно не мыли, а на языке поддатых похабешников тут мало кто говорит
Electric200
Дата: 10.02.2015 12:12:14
поправил,
В моем запросе, мне не нравилось, что в агрегатор попадали записи с одинаковыми "DATE","OPID".
Спасибо "/\/\/\/\" за помощь. С его вариантом стало лучше.. Но потом меня начало не устраивать, что DISTINCT ON основного запроса исключает дублирование после того как выполнились все подзапросы . В итоге, куча ненужных телодвижений.
По этому, покалдовав сделал конфетку. Может кому то пригодится.

                                    SELECT t.*,(
                                           SELECT  odp_agr(ARRAY[ARRAY[f1,f2]]) AS oparray  
                                             FROM  
                                              ( SELECT  
                                                 DISTINCT ON ("OPID") CAST("OPID" AS text) AS  f1,
                                                 CAST("OPVALUE" AS text) AS f2  
                                                FROM                
                                                "2343_ODP"  WHERE 
                                                    "2343_ODP"."DATE" = t."DATE"
                                                    AND "2343_ODP"."DATE" >= '2015-02-07 18:36:01'
                                                    AND "2343_ODP"."DATE" <  '2015-02-09 13:20:07' 
                                              )AS o)
                                                
                                            FROM 
                                                (SELECT 
                                                DISTINCT ON ( "2343_GDP"."DATE") "2343_GDP"."DATE", 
                                                hstore("2343_GDP".*),
                                                "2343_GDP"."POINTXY"[0] AS "POINTX",
                                                EXTRACT (EPOCH FROM "2343_GDP"."DATE")          AS "DATEGPS_UNIX",
                                                EXTRACT (EPOCH FROM "2343_GDP"."DATETRANS")     AS "DATETRANS_UNIX",
                                                "2343_GDP"."POINTXY"[1] AS "POINTY"
                                               
                                                FROM "2343_GDP" 
                                                WHERE "2343_GDP"."DATE">='2015-02-07 18:36:01' AND "2343_GDP"."DATE"<'2015-02-09 13:20:07'
                                                ORDER BY  "2343_GDP"."DATE" ASC)
                                         AS t;
Electric200
Дата: 10.02.2015 12:13:39
В итоге 130 мс . против 35 сек в моей случае) все спасибо)
поправил
Дата: 10.02.2015 12:47:19
Electric200
поправил,
В моем запросе, мне не нравилось, что в агрегатор попадали записи с одинаковыми "DATE","OPID".
<>
ничего не понял
зачем вам агрегатор, если вам нужен (судя по обрывкам мысли в бреде) LIMIT 1 в кореляте, и плоское поле, а не array на выходе из корелята


ну или я опять упоротых похабеньников не понимаю -- с ними это постоянно случается

PS бред в запросах нечетал, многабукав, кг/ам
Electric200
Дата: 10.02.2015 15:07:17
поправил,
Вы все таки вчитайтесь в запрос наверно, поскольку лимит мне не нужен. Иначе зачем мне тогда агрегатор.
Есть две таблицы:
  t1          t2  
DATE       DATE   OPID VALUE
111         1111      2     13
222         1111      2     13
222         1111      4     15 
333         1111      8     12
333         1111      8     12
333         3333      6     10
333         6666      1     1
444         6666      3     1
555         7777      2     2
555         7777      5     5
666 

Количество записей результат запроса, должно быть равно количеству уникальных значений t1.DATE за определенный период времени т.е "DATE". Каждая запись должна содержать массив значений "OPID","VALUE" с таблицы t2, уникальные по "DATE" и "OPID". Т.е одной t1."DATE" может соответствовать несколько несколько t2."DATE" как с одинаковыми так и с разными OPID. JOINы мне не подходят по нескольким причинам. Так какой LIMIT мальчик?)
поправил
Дата: 10.02.2015 15:19:50
Electric200,

да я посмотрел уже по результату, чего вы деете.
криво это всё спроектировано, как архитектурка, т.е., если date это НЕ дата, а таймстамп.

какая селективность дистинкта по "OPID" внутри "DATE" ?

если их подавляется много -- то ORDER BY .. LIMIT 1 (внутри LATERAL или корелята [у вас это был бы кореля в кореляте]) будет много быстрее DISTINCT ON (если это еще не изменено самими кодерами планера -- до сих пор [9.3] DISTINCT ON был в пж убогеньким)

за подробностями -- к богику, у него где-то пдф-ка даже была по мотивам.

ЗЫ а рассказывать задачу вы не умеете, катастрофически