Как получить значение поля на основе макс. Другого поля в VFP v8.0 - PullRequest
0 голосов
/ 06 мая 2010

Итак, у меня есть таблица, и я хочу получить значение из одного поля в записи с наибольшим значением DateTime () в другом поле, где еще одно поле равно определенному значению.

Пример данных:

Balance     Created                      MeterNumber
7924.252    02/02/2010 10:31:48 AM       2743800
7924.243    02/02/2010 11:01:37 AM       2743876 
7924.227    02/02/2010 03:55:50 PM       2743876 

Я хочу получить баланс для записи с наибольшим временем создания для определенного номера счетчика. В VFP 7 я могу использовать:

SELECT a.balance ,MAX(a.created) FROM MyTable a WHERE a.meternumber = '2743876'

Но в драйвере OleDb VFP v8.0, который я использую на своей странице ASP.NET, я должен соответствовать VFP 8, в котором говорится, что вы должны иметь GROUP BY, перечисляющий каждое неагрегированное поле, указанное в SELECT. Это вернет запись для каждого баланса, если я добавлю GROUP BY a.balance к моему запросу.

Да, я мог бы выдать SET ENGINEBEHAVIOR 70, но я хотел знать, можно ли это сделать, не возвращаясь к предыдущей версии?

EDIT Я заставил запрос Фрэнка Переса работать, но только после преобразования полей DateTime в Character для предложения SQL IN. Обратите внимание на перенос полей DateTime с помощью функции TTOC ().

SELECT ; 
    MyTable.created, ; 
    MyTable.balance ; 
FROM ; 
    MyTable ; 
WHERE ; 
    ( MyTable.meternumber = '2743876' ) ; 
    AND ( TTOC(MyTable.created) IN (SELECT TTOC(MAX(created)) FROM MyTable WHERE (meternumber = '2743876')) ) ;

Ответы [ 2 ]

0 голосов
/ 07 мая 2010

DRapp верен в том, что если индекс MeterNumber отсутствует, этот запрос будет медленным.Однако, если вы пытаетесь получить баланс только для одного конкретного счетчика, следующий запрос вернет те же результаты и должен быть быстрее.

SELECT ;
    MyTable.created, ;
    MyTable.balance ;
FROM ;
    MyTable ;
WHERE ;
    ( MyTable.meternumber = '2743876' ) ;
    AND ( MyTable.created IN (SELECT MAX(created) FROM MyTable WHERE (meternumber = '2743876')) ) ;
0 голосов
/ 06 мая 2010
select 
      YT.Balance,
      YT.Created
   from 
      YourTable YT
   where 
          YT.MeterNumber = '2743876'
      and YT.Created in
              ( select 
                      max( YT2.Created ) Created
                   from 
                      YourTable YT2
                   where 
                      YT.MeterNumber = YT2.MeterNumber 
              )

Удалите первые "YT.MeterNumber = '2743876' и" из предложения where, и вы получите все остатки для всех метров ...

Кроме того, если вы запускаете VFP напрямую для тестирования, просто добавьте «;» продолжение строки в конце каждой строки. Не должно быть никаких проблем с VFP6, 7, 8 или 9.

В соответствии с вашими другими комментариями, если этот запрос всегда будет вызываться на основе SINGLE MeterNumber, вы можете настроить его как

select 
      YT.Balance,
      YT.Created
   from 
      YourTable YT,
      ( select YT2.MeterNumber,
               max( YT2.Created ) Created
           from 
               YourTable YT2
           where 
               YT2.MeterNumber = '2743876' 
           group by 
               1 ) YT3
   where 
          YT.MeterNumber = '2743876'
      and YT.MeterNumber = YT3.MeterNumber
      and YT.Created = YT3.Created
...