|
Вопрос о работе агрегатных функций
|
|||
---|---|---|---|
#18+
Нужно выбрать данные последнего отчета за заданный период... Таких отчетов может быть несколько, в случае, если были допущены ошибки( в таком случае будет один отчет с ошибкой и актуальный за тот же самый период ) Вот мои варианты запросов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)Тут я убрал группировку и добавил подзапрос, который для текущего рег. номера выбирает последний отчет, и это сработало... Вопрос - можно ли заставить работать и первый запрос как задумано (т.е агрегатная функция должна относиться к текущей группе) Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2012, 15:05 |
|
Вопрос о работе агрегатных функций
|
|||
---|---|---|---|
#18+
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Хотя раньше у меня такое работало и это странно.Нужно сравнивать планы запроса до и после. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2012, 15:58 |
|
Вопрос о работе агрегатных функций
|
|||
---|---|---|---|
#18+
А если так попробовать?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 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2012, 16:17 |
|
Вопрос о работе агрегатных функций
|
|||
---|---|---|---|
#18+
Как раз сейчас смотрю тот запрос... Он действительно работает, я ничего не понимаю. Приемчик тот же самый Вот немного уменьшннный вариант, где "хитрый прием" работает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То все выглядит как в предыдущем примере. Но если выполнить запрос полностью, поле статуса заполняется. Может быть, можно объяснить как и в какой последовательности все это работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2012, 16:19 |
|
Вопрос о работе агрегатных функций
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2012, 16:25 |
|
Вопрос о работе агрегатных функций
|
|||
---|---|---|---|
#18+
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.
-- > Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2012, 16:47 |
|
|
start [/forum/topic.php?fid=39&msg=38045636&tid=1557306]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
126ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 231ms |
0 / 0 |