Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

Открыть новую тему     Написать ответ в эту тему

aidomars



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Все таки поэкспериментировал, вроде работает такой запрос. А так да, будет время, заменю на одно поле, пока таблицы не хочу трогать.

Код:
SELECT T1.ID1, Max(T1.[Дата]) AS [Max-Дата], Last(T1.[Время]) AS [Last-Время]
FROM T1 AS T2 INNER JOIN T1 ON (T2.[Время] = T1.[Время]) AND (T2.[Дата] = T1.[Дата]) AND (T2.ID1 = T1.ID1)
WHERE (((T1.[Время])=[T2].[Время]) AND ((T2.[Дата])=[T1].[Дата]))
GROUP BY T1.ID1
ORDER BY T1.ID1, Max(T1.[Дата]);

Спасибо всем!

Всего записей: 982 | Зарегистр. 23-04-2007 | Отправлено: 09:09 15-12-2011
Jon_Dow

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aidomars
Ты считаешь что
Код:
INNER JOIN
это не связка сама на себя?
Это она самая и есть в альтернативном исполнении. И время выполнения ДОЛЖНО быть сравнимым при первом исполнении запроса сразу после запуска сервера(то есть без учета кеширования). А так выполнение одного или другого запроса приведет к тому что запрос выполненний вторым будет выполняться почти мгновенно. Повторное выполнение того же запроса также будет выполнено очень быстро.

Всего записей: 732 | Зарегистр. 25-11-2006 | Отправлено: 10:10 15-12-2011
Czechoslovak



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Тип все как положено, краткий формат даты и краткий формат времени. Ведь логически все правильно вычисляет, берет по каждому ID: максимум по Дате (то что требуется) и мах по времени (то что не требуется). Надо брать время в той же строке, что и дата. Вроде бы все просто, а не получается.  
А вкратце задача такая. Пользователи заносят записи в базу, по каждой пишется дата и время записи, надо выбрать последние.

 
А что тут выбирать то. Примерно так

Код:
 
SELECT ID,Max(Data+Time)
FROM ТABLE
GROUP BY ID
 

Всего записей: 175 | Зарегистр. 27-06-2007 | Отправлено: 10:43 15-12-2011
aidomars



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jon_Dow
Кто ж спорил, просто в ходе экспериментов со связкой получались такие запросы, что вешали запрос, хотя он и исполнялся. Вот я и не хотел связу использовать. А сейчас вроде нормально работает.
Czechoslovak
Действительно просто, как бы обратный парсинг. Наверное его и буду выводить в итоговое представление даты и времени с соответствующими типами полей. Спасибо.
В итоге так и сделал, использовал Дата: Format([Дата_Время];"dd.mm.yyyy") и Время: Format([Дата_Время];"hh:mm")

Всего записей: 982 | Зарегистр. 23-04-2007 | Отправлено: 11:47 15-12-2011 | Исправлено: aidomars, 12:34 15-12-2011
Czechoslovak



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
aidomars
Че мудрить

Код:
 
SELECT ID,CDate(Int(Max(Data+Time))),CDate(Max(Data+Time) - Int(Max(Data+Time)))
FROM ТABLE  
GROUP BY ID  
 

И будут выводиться истинные числовые значения

Всего записей: 175 | Зарегистр. 27-06-2007 | Отправлено: 12:57 15-12-2011
aidomars



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Czechoslovak
Да разницы тут никакой думаю, в запросе ли работать с датой, получая время и дату, или же выводить в итоговую форму через Format.

Всего записей: 982 | Зарегистр. 23-04-2007 | Отправлено: 13:16 15-12-2011
aidomars



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Теперь другая проблема возникла: в столбец "Дата" выводятся значения из запроса., тут все гуд. В конструкторе: Format([Дата_Время];"dd.mm.yyyy"), тут немножко не гуд... Сортировка работает как со строками, т.е. по дате сортирует (01.12.2011, 02.10.2011, 03.12.2011 и т.д.). Если пишу в конструкторе Cdate(Format([Дата_Время];"dd.mm.yyyy")), то при сортировке ругается на пустые значения, т.к. не у всех стоит дата.  
Как еще можно сделать, чтоб корректно сортировалось по дате?

Всего записей: 982 | Зарегистр. 23-04-2007 | Отправлено: 16:06 16-12-2011
Jon_Dow

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aidomars
Не надо разводить пургу. Уточни какая конкретно структура таблицы у тебя имеется. Можно в формате CREATE TABLE... (Вариант со связкой таблицы самой на себя работает, а остальное - это все сильно зависимо от конкретной реализации таблицы).

Всего записей: 732 | Зарегистр. 25-11-2006 | Отправлено: 17:25 16-12-2011
aidomars



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот сейчас набросал дома. Тоже самое. Проблема в том, что сортировка в Форме должна корректно работать если тип данных - дата. А в таблице "Главная" есть ID (3,5), у которых нет записей в "Дата записи". Соответсвенно в Форме дата у них пустая.
Вот и получается, что тип данных можно задать только в Форме.

http://rghost.ru/35064581
 
Добавлено:
Вроде удалось построить методом тыка

Код:
IIf(IsNull([Дата_Время]), Null, CDate(Format([Дата_Время],"dd.mm.yyyy"))) AS дата

Всего записей: 982 | Зарегистр. 23-04-2007 | Отправлено: 20:38 16-12-2011
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aidomars

Цитата:
Вот и получается, что тип данных можно задать только в Форме

Сортировку надо делать не по полю 'Дата записи', а добавить в select вычисляемое поле 'DaysCount' и сортировать по этому полю.
В 'DaysCount' поместить DATEDIFF(day, '01/01/1900', [Дата записи])
Т.к. пустое поле = NULL то и представление NULL в datetime формате будет '01/01/1900'
Следовательно, у всех пустых полей разница равна 0

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 00:44 17-12-2011
aidomars



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp
Так если сейчас уже сортировка работает, смысла нет добавлять вычисляемое поле.

Всего записей: 982 | Зарегистр. 23-04-2007 | Отправлено: 10:52 17-12-2011
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aidomars
А я и не говорю, что надо обязательно. Просто одно из возможных решений на сервере.

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 11:18 17-12-2011 | Исправлено: dneprcomp, 11:19 17-12-2011
Unnicked

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть следующая задача. Таблица состоит из трех столбцов - id, ptr и datetime.
 
Нужен запрос, который обновит столбец ptr, если он равен -1, записав в него значение ptr с тем же id, у которого максимальное datetime и который не равен -1.
 
Пожалуйста, помогите. Спасибо.

Всего записей: 1128 | Зарегистр. 19-08-2005 | Отправлено: 11:06 18-05-2012
exteris

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Unnicked
Как-то запутанно объяснили. Можете привести небольшой пример с данными и что хотите получить?

Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 11:28 18-05-2012
A_V

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Unnicked
как-то так, если я правильно понял:
 
update t set t.ptr =  
(
  select t2.ptr  
    from t t2
   where t2.id = t.id
     and t2.datetime =  
      (select max(datetime)  
         from t t3  
         where t3.id = t2.id
         and t3.ptr <> -1)
)  
where t.ptr=-1
 

Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 11:40 18-05-2012 | Исправлено: A_V, 11:42 18-05-2012
Unnicked

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
exteris
Было:
 
ptr id datetime
-1 4 12.05.2012  0:08:11
-1 4 29.04.2012  0:08:11
15 4 30.04.2012  0:08:11
17 4 14.04.2012  0:08:11
-1 3 17.04.2012  0:08:11
24 3 03.05.2012  0:08:11
12 3 04.05.2012  0:08:11
 
После запрос должно стать:
 
ptr id datetime
15 4 12.05.2012  0:08:11
15 4 29.04.2012  0:08:11
15 4 30.04.2012  0:08:11
17 4 14.04.2012  0:08:11
12 3 17.04.2012  0:08:11
24 3 03.05.2012  0:08:11
12 3 04.05.2012  0:08:11
 
A_V
Спасибо, все правильно поняли. Запрос работает, но выполняется долго - порядка 20 секунд (БД - Firebird, может в этом конечно проблема, но от нее отказаться нельзя...). В таблице порядка 2000 записей и всего 3 строки, в которых -1

Всего записей: 1128 | Зарегистр. 19-08-2005 | Отправлено: 11:56 18-05-2012
exteris

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Запрос работает, но выполняется долго - порядка 20 секунд

Индекс по ID поможет.

Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 12:39 18-05-2012
Unnicked

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
exteris, спасибо. Индекс помог

Всего записей: 1128 | Зарегистр. 19-08-2005 | Отправлено: 14:04 18-05-2012
bandyn



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ORACLE запрос:
 
select distinct
ENT.TITLE_SURNAME, ENT.NAME, ENT.OTCHESTVO, ENT.BIRTHDAY,
GUN.SERIES, GUN.NUMB, GUN.MAKE_YEAR,
CGUN.MODEL_TITLE, CGUN.CALIBR_CODE_1, CGUN.CALIBR_CODE_2, CGUN.CALIBR_CODE_3, CGUN.CALIBR_CODE_4,
CGUN.KINDGUN_CODE, CGUN.TYPE_GUN_CODE,
DOC.DOC_NAME||' '||DOC.DOC_SERIES||' '||DOC.DOC_NUMB||' от '||DOC.DOC_DATE as DOCS,
ENDS.END_DATE
from
ENT_PERSONS ENT,
DOC_RELATIONS SV,
GUN_GUNS GUN,
CODE_GUN CGUN,
DOC_DOCUMENTS_DOC_RELATIONS DRL,
DOC_DOCUMENTS DOC,
DOC_PERMISSIONS ENDS
where
ENT.TITLE_SURNAME='ФАМИЛИЯ' and ENT.NAME='ИМЯ' and ENT.OTCHESTVO='ОТЧЕСТВО' and ENT.BIRTHDAY='01.01.1985' and
ENT.ID=SV.EP_ID and SV.STATE=6 and SV.GUN_ID is not null and
SV.GUN_ID=GUN.ID and SV.ID=DRL.DRL_ID and DRL.DDC_ID=DOC.ID and ENDS.DDC_ID=DRL.DDC_ID and
CGUN.CODE=GUN.CODEGUN_CODE
 
1. Поле ENDS.END_DATE - Как вывести максимальную дату?
max(ENDS.END_DATE) over(partition by ENDS.END_DATE) - не помогает, выводит все даты

Всего записей: 394 | Зарегистр. 18-11-2004 | Отправлено: 10:29 29-11-2013
A_V

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bandyn

Код:
 
select distinct
ENT.TITLE_SURNAME, ENT.NAME, ENT.OTCHESTVO, ENT.BIRTHDAY,  
GUN.SERIES, GUN.NUMB, GUN.MAKE_YEAR,  
CGUN.MODEL_TITLE, CGUN.CALIBR_CODE_1, CGUN.CALIBR_CODE_2, CGUN.CALIBR_CODE_3, CGUN.CALIBR_CODE_4,  
CGUN.KINDGUN_CODE, CGUN.TYPE_GUN_CODE,  
DOC.DOC_NAME||' '||DOC.DOC_SERIES||' '||DOC.DOC_NUMB||' от '||DOC.DOC_DATE as DOCS,  
(SLECT MAX(ENDS.END_DATE) FROM DOC_PERMISSIONS ENDS WHERE ENDS.DDC_ID=DRL.DDC_ID)
from  
ENT_PERSONS ENT,  
DOC_RELATIONS SV,  
GUN_GUNS GUN,  
CODE_GUN CGUN,  
DOC_DOCUMENTS_DOC_RELATIONS DRL,  
DOC_DOCUMENTS DOC
where  
ENT.TITLE_SURNAME='ФАМИЛИЯ' and ENT.NAME='ИМЯ' and ENT.OTCHESTVO='ОТЧЕСТВО' and ENT.BIRTHDAY='01.01.1985' and  
ENT.ID=SV.EP_ID and SV.STATE=6 and SV.GUN_ID is not null and  
SV.GUN_ID=GUN.ID and SV.ID=DRL.DRL_ID and DRL.DDC_ID=DOC.ID and  
CGUN.CODE=GUN.CODEGUN_CODE  
 

Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 12:21 29-11-2013
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru