Страницы: 1
RSS
sql запрос
 
Здравствуйте, подскажите пожалуйста  
есть таблица, состоящая из двух полей:  
1) дата  
2) время  
нужно sql запросом вытащить одно значение:  
максимальное значение время, за максимальное значение даты  
 
то есть из таблицы    
11.08.2009 12:05  
12.08.2009 12:05  
13.08.2009 14:05  
13.08.2009 13:05  
должен вынести  
13.08.2009 14:05
 
хочу уточнить: мне нужен только код sql
 
Помнится, Слэну хорошо давались SQL запросы, но вообще есть же форумы специально посвященные SQL:    
http://www.sql.ru/forum/actualforum.aspx
KL
 
Если делать данный запрос через Access, то выглядит так:  
SELECT Max(Таблица1.Поле1) AS [Max-Поле1]
FROM Таблица1;
 
Так не получится. Запрос будет работать некоректно. Например, если применить к таблице:  
11.08.2009 12:05  
12.08.2009 15:05  
13.08.2009 14:05  
13.08.2009 13:05  
получится:    
12.08.2009 15:05  
нужно группировать по дате  
а если группировать по дате - то не получается единственного макс. значения - а выходят все сгруппированные даты, которые есть в таблице
 
не много ошибся в предыдущем тезисе, правильный вариант:  
Так не получится. Запрос будет работать некоректно. Например, если применить к таблице:  
11.08.2009 12:05  
12.08.2009 15:05  
13.08.2009 14:05  
13.08.2009 13:05  
получится:    
13.08.2009 15:05  
нужно группировать по дате  
а если группировать по дате - то не получается единственного макс. значения - а выходят все сгруппированные даты, которые есть в таблице
 
вообще-то KL меня перехваливает(видимо просто путая с кем-то) - я в sql практически никак, до этого времени..  
но раз уж назвали груздем..  
 
вот что получилось в microsoft query:  
 
SELECT `Лист1$`.дата, `Лист1$`.время  
FROM `C:\DOCUMENTS AND SETTINGS\OBOROT\МОИ ДОКУМЕНТЫ\XLS\Книга1.xls`.`Лист1$` `Лист1$`  
WHERE `Лист1$`.время IN  
(  
SELECT MAX(`Лист1$`.время)  
FROM `C:\DOCUMENTS AND SETTINGS\OBOROT\МОИ ДОКУМЕНТЫ\XLS\Книга1.xls`.`Лист1$` `Лист1$`  
WHERE `Лист1$`.дата IN  
(  
SELECT MAX(`Лист1$`.дата)  
FROM `C:\DOCUMENTS AND SETTINGS\OBOROT\МОИ ДОКУМЕНТЫ\XLS\Книга1.xls`.`Лист1$` `Лист1$`  
));
Живи и дай жить..
 
Спасибо, Слэн,  - но я ничего не понял).    
Моя главная задача - сделать макрос, который в экселе будет доставать данные из аксеса sql запросом. Для этого нужно написать sql запрос и проверить его в аксесе. Но Ваш случай - это не запрос аксеса. Поэтому не подходит
 
это sql-запрос..  
 
в аксессе или где еще он все равно остается sql-запросом  
 
кроме того, я приложил и файл с запросом - откройте его свойства:  
данные-подключения-свойства-определение  
 
есть строка подключения и есть команда sql  
 
так вот - для подключения не к иксель, а к аксесс нужно изменить строку подключения - для этого создайте любой запрос к аксесс с помощью мастера,  
а в sql изменятся только имена полей - вместо Лист1 будет имя вашей таблицы..  
 
если вышлите пример базы данных аксес, то напишу вам запрос для аксес, хотя, повторюсь, в sql(и аксес) ни б ни м(аксес даже не установлен :) )  
 
а запрос то работает!
Живи и дай жить..
 
Слэн, попытался применить Вашу конструкцию в запросе аксес:  
SELECT ForexQuotes.Дата, ForexQuotes.Время  
FROM ForexQuotes  
WHERE ForexQuotes.Время IN  
SELECT Max(ForexQuotes.Время)  
FROM ForexQuotes  
WHERE ForexQuotes.Дата IN  
SELECT Max(ForexQuotes.Дата)  
FROM ForexQuotes;  
Пишет ошибку: "Оператор in без ()...", после того, как поставил "()" написал ошибку синтаксиса в выражении "ForexQuotes.Время IN()"  
Как надо использовать оператор IN?
 
SELECT ForexQuotes.Дата, ForexQuotes.Время  
FROM ForexQuotes  
WHERE ForexQuotes.Время IN  
(SELECT Max(ForexQuotes.Время)  
FROM ForexQuotes  
WHERE ForexQuotes.Дата IN  
(SELECT Max(ForexQuotes.Дата)  
FROM ForexQuotes));  
 
 
вложенные запросы надо в скобочки ставить..  
 
а почему надо в аксес проверять? почему не в иксель? ведь макрос именно в иксель, насколько я понял..
Живи и дай жить..
 
Слэн, база данных - признателен за помощь!  
Там много полей мне нужны только дата и время
 
Я попробывал применить - запрос работает - но отдельно ищет максимум по дате и от дельно по времени - при этом отражает все сгрупированные даты -их получается 3.  
 
Нужна одна-запись - максимальное время в максимальной дате.
 
не распаковывается...  
Попробуйте слить в таблицу Ексель, а там уже сделаю в Аксесе
 
нужно установить формат даты в Аксессе примерно  такой dd.mm.yy 00.00
 
оказалось не все так просто..  
 
но все же справился - см вложение  
 
нужно только изменить путь к файлу базы данных..
Живи и дай жить..
 
не все так просто - это первоначально искались все записи(для любой даты) в которых время соответствует максимальному времени при максимальной дате.  
 
исправил.. наверное можно элегантнее(мягко говоря)..  
 
а, кстати, оно не будет самой последней записью? - тогда все проще :)
Живи и дай жить..
 
в экселе
 
да можно и с последней - но что бы была единственной записью - а если у Вас уже назрело решение с максимальной то напишите и его пожалуйста - оба варианта хочу посмотреть)
 
Если я правильно понял, то Вам нужна одна строка запроса? Тогда так...  
 
SELECT TOP 1 [to BD].Код, [to BD].Котировка, [to BD].Период, [to BD].Дата, [to BD].Время, [to BD].OPEN, [to BD].HIGHT, [to BD].LOW, [to BD].CLOSE, [to BD].VOLUME, Max([Дата] & [Время]) AS Выражение
FROM [to BD]
GROUP BY [to BD].Код, [to BD].Котировка, [to BD].Период, [to BD].Дата, [to BD].Время, [to BD].OPEN, [to BD].HIGHT, [to BD].LOW, [to BD].CLOSE, [to BD].VOLUME
ORDER BY Max([Дата] & [Время]) DESC;
 
У меня работает вот так:  
 
--------------------------------------  
 
SELECT *  
FROM  `C:\BD.mdb`.ForexQuotes  
WHERE ForexQuotes.Дата+ForexQuotes.Время IN  
(SELECT MAX(ForexQuotes.Дата+ForexQuotes.Время)  
FROM  `C:\BD.mdb`.ForexQuotes);  
 
--------------------------------------  
 
Вместо * можно указать желаемые поля.
KL
 
Или для подстраховки:  
 
--------------------------------------  
 
SELECT TOP 1 *  
FROM `C:\BD.mdb`.ForexQuotes  
WHERE ForexQuotes.Дата+ForexQuotes.Время IN  
(SELECT MAX(ForexQuotes.Дата+ForexQuotes.Время)  
FROM `C:\BD.mdb`.ForexQuotes);  
 
--------------------------------------
KL
 
Попробовал через макрос - тоже работает:  
 
Option Explicit  
 
Sub ADOImportFromAccessTable()  
   Dim cn As ADODB.Connection  
   Dim rs As ADODB.Recordset  
   Dim strSQL As String  
     
   strSQL = "SELECT TOP 1 * FROM `C:\BD.mdb`.ForexQuotes " & _  
       "WHERE ForexQuotes.Дата+ForexQuotes.Время " & _  
       "IN(SELECT MAX(ForexQuotes.Дата+ForexQuotes.Время) " & _  
       "FROM `C:\BD.mdb`.ForexQuotes);"  
     
   Set cn = New ADODB.Connection  
   cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\BD.mdb;"  
   Set rs = New ADODB.Recordset  
     
   rs.Open strSQL, cn, , , adCmdText  
     
   ActiveSheet.Range("A1").CopyFromRecordset rs  
     
   rs.Close  
   Set rs = Nothing  
   cn.Close  
   Set cn = Nothing  
End Sub
KL
 
Собственно все это можно записать еще короче:  
 
SQL запрос:  
------------------------------------  
SELECT TOP 1 *  
FROM [ForexQuotes]
WHERE Дата+Время IN  
(SELECT MAX(Дата+Время)  
FROM [ForexQuotes]);
 
 
ADO макрос:  
------------------------------------  
Option Explicit  
 
Sub ADOImportFromAccessTable()  
   Dim cn As ADODB.Connection  
   Dim rs As ADODB.Recordset  
   Dim strSQL As String  
     
   strSQL = "SELECT TOP 1 * FROM [ForexQuotes] " & _
       "WHERE Дата+Время " & _  
       "IN(SELECT MAX(Дата+Время) " & _  
       "FROM [ForexQuotes]);"
     
   Set cn = New ADODB.Connection  
   cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\BD.mdb;"  
   Set rs = New ADODB.Recordset  
     
   rs.Open strSQL, cn, , , adCmdText  
     
   ActiveSheet.Range("A1").CopyFromRecordset rs  
     
   rs.Close  
   Set rs = Nothing  
   cn.Close  
   Set cn = Nothing  
End Sub
KL
 
Спасибо всем за помощь!
Страницы: 1
Наверх