20.11.2008, 13:40 | #1 |
Участник
|
Как получить периодические значения
Друзья!
Подскажите, как можно выполнить вложенный запрос в X++ для получения периодических значений? Таблица периодических значений MyTable следующей структуры: Key - ключ, Value - значение, TransDate - дата начала действия значения на T-SQL набор можно получить так: Код: select t1.TransDate, t1.Key, t1.Value from MyTable t1 join ( select max(TransDate) TransDate, Key from MyTable where TransDate <= getdate() group by Key ) t2 on t2.TransDate = t1.TransDate and t2.Key = t1.Key |
|
20.11.2008, 14:02 | #2 |
Ищущий знания...
|
Цитата:
Сообщение от pyramid
...
на T-SQL набор можно получить так: Код: select t1.TransDate, t1.Key, t1.Value from MyTable t1 join ( select max(TransDate) TransDate, Key from MyTable where TransDate <= getdate() group by Key ) t2 on t2.TransDate = t1.TransDate and t2.Key = t1.Key
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
20.11.2008, 14:05 | #3 |
MCITP
|
Боюсь, высокотехнологичный X++SQL не способен написать именно так.
Вложенный цикл Вам поможет.
__________________
Zhirenkov Vitaly |
|
20.11.2008, 14:12 | #4 |
Участник
|
Если заменить вложенный запрос на проверку факта существования записей с бОльшим значением даты из заданного диапазона, то все решается достаточно просто
X++: MyTable myTable, myTable2; ; select myTable.TransDate, myTable.Key, myTable.Value from myTable where myTable.TransDate <= getdate() notexists join myTable2 where myTable2.RecId != myTable.RecId && myTable2.key == myTable.key && myTable2.TransDate > myTable.TransDate && myTable2.TransDate <= getdate() |
|
|
За это сообщение автора поблагодарили: pyramid (1). |
20.11.2008, 14:13 | #5 |
MCITP
|
Такой запрос, насколько я понимаю, даёт аналогичный результат?
X++: Select T1.Transdate, T1.Key, T1.Value From Mytable T1 Where T1.Transdate <= Getdate ( ) And Not Exists ( Select Null From Mytable T2 Where T2.Transdate > T1.Transdate And T2.Key = T1.Key ) UPD забыл условие во вложенном цикле Where T2.Transdate <= Getdate ( )
__________________
Zhirenkov Vitaly Последний раз редактировалось ZVV; 20.11.2008 в 14:18. |
|
|
За это сообщение автора поблагодарили: pyramid (1). |
20.11.2008, 14:20 | #6 |
Участник
|
Цитата:
X++: select Key, Value, maxof(TransDate) from MyTable where MyTable.Key == _key && MyTable.TransDate <= systemdateget(); |
|
20.11.2008, 14:21 | #7 |
MCITP
|
2 Владимир Максимов
Помойму в данном случае вы перемудрили с recid. Ваш взапрос не вернёт нужные данные, если за нужную дату окажется несколько строк.. Если б было условие только на одну строчку, тогда да, и то нужно было бы использовать не "!=", а ">" или "<" Distinct в QueryBuildDataSource
__________________
Zhirenkov Vitaly |
|
20.11.2008, 14:23 | #8 |
MCITP
|
Цитата:
Сообщение от pyramid
А если мне нужно показать это в гриде, то тащить данные во временную таблицу, и напрягать сервер запросами типа
X++: select Key, Value, maxof(TransDate) from MyTable where MyTable.Key == _key && MyTable.TransDate <= systemdateget();
__________________
Zhirenkov Vitaly |
|
20.11.2008, 14:46 | #9 |
Участник
|
Цитата:
А, во-вторых, запрос pyramid также вернет несколько значений. Цитата:
Сообщение от ZVV
Если б было условие только на одну строчку, тогда да, и то нужно было бы использовать не "!=", а ">" или "<"
Distinct в QueryBuildDataSource Цитата:
Сообщение от ZVV
В общем, нужно учитывать специфику запроса
Поскольку "дубли" исключены по самой природе справочника, то проблем быть не должно. Последний раз редактировалось Владимир Максимов; 20.11.2008 в 14:51. |
|
20.11.2008, 14:54 | #10 |
Участник
|
Спасибо, друзья!
Оба способа хороши, остановился на следующем: X++: while select myTable where myTable.TransDate <= _getdate notexists join myTable2 where myTable2.TransDate <= _getdate && myTable2.Key == myTable.Key && myTable2.TransDate > myTable.TransDate { info(strfmt("%1 : %2 : %3", myTable.Key, myTable.Value, myTable.TransDate)); } |
|
20.11.2008, 15:15 | #11 |
MCITP
|
Владимир, на самом деле ваш запрос и мой - это одно и тоже, только у вас было дополнительное условие на recId, которое по смыслу является лишним, т.к. оно никогда не будет равно из-за условия
X++: && myTable2.TransDate > myTable.TransDate А вот "Ваш вапрос не вернёт нужные данные, если за нужную дату окажется несколько строк.." было лишним, это уже я ошибся, т.к. думал уже о том, что буду писать дальше. А дальше следующее: насчёт "!=" и ">": Исходный запрос возвращает именно все строки с максимальной датой, т.е. несколько, если бы их было несколько в таблице. (вопрос о том какие данные в таблице мы не рассматриваем) А вот если бы нужно было только одно из них, то тогда и надо было бы использовать проверку рекID и именно с ">" или "<", т.к. иначе запрос не вернул бы данных. т.е. если бы условие было X++: && myTable2.TransDate >= myTable.TransDate X++: Select T1.Transdate, T1.Key, T1.Value From Mytable T1 Where T1.Transdate <= getDate() And Not Exists ( Select Null From Mytable T2 Where T2.Recid != T1.Recid And T2.Key = T1.Key And T2.Transdate >= T1.Transdate And T2.Transdate <= getDate())
__________________
Zhirenkov Vitaly |
|
20.11.2008, 16:19 | #12 |
Участник
|
Да, действительно перемудрил . Если дата не равна, то и RecId никак не может оказаться равным.
|
|
Теги |
периодические значения |
|
|