powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вопрос о работе агрегатных функций
7 сообщений из 7, страница 1 из 1
Вопрос о работе агрегатных функций
    #38045471
dizzy1984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно выбрать данные последнего отчета за заданный период... Таких отчетов может быть несколько, в случае, если были допущены ошибки( в таком случае будет один отчет с ошибкой и актуальный за тот же самый период )
Вот мои варианты запросовselect calcstatementfk->RegNumber, max(DateCreate), 
max( case when DateCreate = max(DateCreate) then LocalState end )
from
ASV_Entities.CameralCheck
where calcstatementfk->Year = 2012
group by calcstatementfk->RegNumber
Вначале я фильтрую по году, далее выбираю группировку по конкретной организации (рег. номеру). Выбираю рег. номер, дату последнего отчета. И вот тут мне нужно описание этого последнего отчета, для чего я предпринимаю "финт ушами". Я пишу использую агрегатную функцию max, и в качестве ее аргумента делаю case when datecrate=max(datecreate), я подразумеваю max для текущей группы строк(для текущего рег. номера), однако судя по результатам, где есть статус есть только у одной, последней строки, субд подразумевает max для всей выборки вообще, а не для текущего рег. номера. Хотя раньше у меня такое работало и это странно.

Тогда я переписал это по-другомуselect c.calcstatementfk->RegNumber, c.DateCreate, c.LocalState
from
ASV_Entities.CameralCheck c
where c.calcstatementfk->Year = 2012
and c.DateCreate = (select top 1 c1.datecreate from ASV_Entities.CameralCheck c1 where c1.calcstatementfk->Year = 2012 and c1.calcstatementfk->RegNumber = c.calcstatementfk->RegNumber order by c1.DateCreate desc)Тут я убрал группировку и добавил подзапрос, который для текущего рег. номера выбирает последний отчет, и это сработало...


Вопрос - можно ли заставить работать и первый запрос как задумано (т.е агрегатная функция должна относиться к текущей группе)

Спасибо.
...
Рейтинг: 0 / 0
Вопрос о работе агрегатных функций
    #38045583
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dizzy1984 ,
select * from
(select calcstatementfk->RegNumber,max(DateCreate %foreach(calcstatementfk->RegNumber)) DateCreate,
case when DateCreate = max(DateCreate %foreach(calcstatementfk->RegNumber)) then LocalState end LocalState
from ASV_Entities.CameralCheck where calcstatementfk->Year = 2012) 
where LocalState is not nulldizzy1984Хотя раньше у меня такое работало и это странно.Нужно сравнивать планы запроса до и после.
...
Рейтинг: 0 / 0
Вопрос о работе агрегатных функций
    #38045636
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если так попробовать?select calcstatementfk->RegNumber, max(DateCreate),
max(case when DateCreate = max(DateCreate %foreach(calcstatementfk->RegNumber)) then LocalState end)
from
ASV_Entities.CameralCheck
where calcstatementfk->Year = 2012
group by calcstatementfk->RegNumber
...
Рейтинг: 0 / 0
Вопрос о работе агрегатных функций
    #38045639
dizzy1984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как раз сейчас смотрю тот запрос... Он действительно работает, я ничего не понимаю. Приемчик тот же самый
Вот немного уменьшннный вариант, где "хитрый прием" работаетselect cc.insurerfk->regnumberpfr as "Регистрационный номер", 
cc.insurerfk->name as "Наименование", 
cc.FinishDate as "Дата КП", cc.Status1 as "Статус КП"
from
(
select calcstatementfk->insurerfk, max(FinishDate) as FinishDate, max( case when FinishDate = max(FinishDate) then LocalState end ) as Status1 from
ASV_Entities.CameralCheck
where calcstatementfk->Year = 2012 and calcstatementfk->Period = 3
group by calcstatementfk->insurerfk
) as cc
right outer join
(
select insurerfk from
ASV_Entities.CalcStatementTitle
group by insurerfk
) as rsv
on rsv.insurerfk = cc.insurerfk
where
(
rsv.insurerfk->regnumberpfr = '055003004032' or
rsv.insurerfk->regnumberpfr = '055009037776' or
rsv.insurerfk->regnumberpfr = '055009041742' or
rsv.insurerfk->regnumberpfr = '055008000868' or
rsv.insurerfk->regnumberpfr = '055004027991'
)
Что интересно, если я беру отдельно запросselect calcstatementfk->insurerfk, max(FinishDate) as FinishDate, max( case when FinishDate = max(FinishDate) then LocalState end ) as Status1 from
ASV_Entities.CameralCheck
where calcstatementfk->Year = 2012 and calcstatementfk->Period = 3
group by calcstatementfk->insurerfkТо все выглядит как в предыдущем примере.
Но если выполнить запрос полностью, поле статуса заполняется.

Может быть, можно объяснить как и в какой последовательности все это работает?
...
Рейтинг: 0 / 0
Вопрос о работе агрегатных функций
    #38045652
dizzy1984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servitА если так попробовать?select calcstatementfk->RegNumber, max(DateCreate),
max(case when DateCreate = max(DateCreate %foreach(calcstatementfk->RegNumber)) then LocalState end)
from
ASV_Entities.CameralCheck
where calcstatementfk->Year = 2012
group by calcstatementfk->RegNumber

Работает!


Но хочется разобраться, почему работает также и мой большой запрос с right outer join.
...
Рейтинг: 0 / 0
Вопрос о работе агрегатных функций
    #38045688
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dizzy1984Работает!


Но хочется разобраться, почему работает также и мой большой запрос с right
outer join.Стечение обстоятельств.
Изначально Ваш "хитрый" запрос ошибочен, например:Class del.c Extends %Persistent
{

Property RegNumber As %String;

Property DateCreate As %Date;

Property LocalState As %String;

ClassMethod Fill()
{
  d ..%KillExtent()
  &sql(insert into del.c(RegNumber,DateCreate,LocalState)values('1',{d '2000-01-01'},1))
  &sql(insert into del.c(RegNumber,DateCreate,LocalState)values('1',{d '2000-01-02'},2))
  &sql(insert into del.c(RegNumber,DateCreate,LocalState)values('1',{d '2000-01-03'},3))
  &sql(insert into del.c(RegNumber,DateCreate,LocalState)values('2',{d '2000-01-06'},5))
  &sql(insert into del.c(RegNumber,DateCreate,LocalState)values('2',{d '2000-01-05'},6))
  &sql(insert into del.c(RegNumber,DateCreate,LocalState)values('2',{d '2000-01-04'},7))
}

}select
RegNumber,
max(DateCreate),
max(case when DateCreate = max(DateCreate) then LocalState end)
from del.c
group by RegNumber

Результат:RegNumberAggregate_2Aggregate_3103.01.2000(null)206.01.20005select
RegNumber,
max(DateCreate),
max(case when DateCreate = max(DateCreate %foreach(RegNumber)) then LocalState end)
from del.c
group by RegNumber

Результат:RegNumberAggregate_2Aggregate_3103.01.20003206.01.20005
PS:
Код: sql
1.
2.
3.
4.
5.
rsv.insurerfk->regnumberpfr = '055003004032' or
rsv.insurerfk->regnumberpfr = '055009037776' or
rsv.insurerfk->regnumberpfr = '055009041742' or
rsv.insurerfk->regnumberpfr = '055008000868' or
rsv.insurerfk->regnumberpfr = '055004027991'

-- >
Код: sql
1.
rsv.insurerfk->regnumberpfr in ('055003004032','055009037776','055009041742','055008000868','055004027991')
...
Рейтинг: 0 / 0
Вопрос о работе агрегатных функций
    #38045712
dizzy1984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я примерно так для себя и определил...
Спасибо за помощь!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вопрос о работе агрегатных функций
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]