|
![]() |
#1 |
MCITP
|
![]()
Боюсь, высокотехнологичный X++SQL не способен написать именно так.
Вложенный цикл Вам поможет.
__________________
Zhirenkov Vitaly |
|
![]() |
#2 |
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). |
![]() |
#3 |
MCITP
|
![]()
2 Владимир Максимов
Помойму в данном случае вы перемудрили с recid. Ваш взапрос не вернёт нужные данные, если за нужную дату окажется несколько строк.. Если б было условие только на одну строчку, тогда да, и то нужно было бы использовать не "!=", а ">" или "<" Distinct в QueryBuildDataSource
__________________
Zhirenkov Vitaly |
|
![]() |
#4 |
Участник
|
Цитата:
А, во-вторых, запрос pyramid также вернет несколько значений. Цитата:
Сообщение от ZVV
![]() Если б было условие только на одну строчку, тогда да, и то нужно было бы использовать не "!=", а ">" или "<"
Distinct в QueryBuildDataSource Цитата:
Сообщение от ZVV
В общем, нужно учитывать специфику запроса
Поскольку "дубли" исключены по самой природе справочника, то проблем быть не должно. Последний раз редактировалось Владимир Максимов; 20.11.2008 в 14:51. |
|
![]() |
#5 |
Участник
|
Спасибо, друзья!
Оба способа хороши, остановился на следующем: 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)); } |
|
![]() |
#6 |
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 |
|
![]() |
#7 |
Участник
|
Цитата:
X++: select Key, Value, maxof(TransDate) from MyTable where MyTable.Key == _key && MyTable.TransDate <= systemdateget(); |
|
![]() |
#8 |
MCITP
|
![]() Цитата:
Сообщение от pyramid
![]() А если мне нужно показать это в гриде, то тащить данные во временную таблицу, и напрягать сервер запросами типа
X++: select Key, Value, maxof(TransDate) from MyTable where MyTable.Key == _key && MyTable.TransDate <= systemdateget();
__________________
Zhirenkov Vitaly |
|
Теги |
периодические значения |
|
|