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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ekemov
4. Для MS SQL SERVER. Немедленно после Insert сделать

Код:
DECLARE @ID as decimal(18, 0)
SET @ID = SCOPE_IDENTITY()  
Update [table name] set RGNUM = @ID Where AutoID = @ID

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 18:22 08-12-2011 | Исправлено: dneprcomp, 18:45 08-12-2011
wasilissk

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

Цитата:
либо в запросе где то участвует

Два раза указать одно и то же поле.

Цитата:
проще через 2 ключа связь делать

Как-то это не вяжется с условием.  

Цитата:
А второе поле по задумке базы берет значение из первого.

Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 19:08 08-12-2011
MasMaX



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
wasilissk
Понятия не имею зачем там два поля, но основным считаеся RGNUM которое не увиличивается само. База у меня огромная (месяц - 150 тыс записей, года 4 ведется), поэтмоу поменять я не смогу а могу лишь подстроиться под нее. Там еще зачем-то поле RGNUM текстовое всегда 10 символов с ведущими пробелами.
 
Оно ему всегда равно. По крайней мере в той таблице над которой я колдую.  
 
Вс таки я пришел к выводу что проще разделять на два запроса. Даже простой второй запрос получается:
UPDATE d2011 SET rgnum=CAST(autoid as SQL_CHAR) WHERE numdoc=....
 
Кстати, а где про триггеры-генераторы можно почитать доступным языком? Подозреваю что таким образом и сделано многое в данной базе.

Всего записей: 279 | Зарегистр. 11-05-2005 | Отправлено: 23:15 08-12-2011
YuriyRR



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

Цитата:
Кстати, а где про триггеры-генераторы можно почитать доступным языком?  

Хелен Борри  
Firebird Руководство разработчика баз данных

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 01:18 09-12-2011
wasilissk

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

Цитата:
Кстати, а где про триггеры-генераторы можно почитать доступным языком? Подозреваю что таким образом и сделано многое в данной базе.

Сильно зависит от того, какой сервер у вас используется. Озвучьте.

Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 09:08 09-12-2011
aidomars



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Поможите с запросом.
Имеем таблицу table, в ней поля: ID, дата, время. ID может повторяться.
Надо создать запрос: группировка по ID max(дата), время.
Мой запрос выводит неправильное время, а именно самое максимальное по одному ID. А надо время которое принадлежит строке с максимальной датой.

Код:
SELECT table.ID, Max(table.[Дата]) AS [Max-Дата], Max(table.[Время]) AS [Max-Время]
FROM table
GROUP BY table.ID
ORDER BY table.ID;

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



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

Всего записей: 123 | Зарегистр. 10-11-2008 | Отправлено: 16:20 14-12-2011
mdid

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aidomars
если правильно понял то
 
set dateformat dmy
create table #tmp (id INT, dt datetime)
insert into #tmp
select 1,cast('01.01.2001' as datetime)  
union  
select 1,cast('03.01.2001' as datetime)  
union
select 2,cast('01.03.2001' as datetime)  
union  
select 2,cast('03.05.2001' as datetime)  
union
select 3,cast('01.03.2001' as datetime)  
union  
select 4,cast('03.01.2001' as datetime)  
 
 
select id,MAX(dt) from #tmp
group by id
 
drop table #tmp
 
 
ПС
у меня sql 2005 посему нет разделения на date и time
просто уберите мах на тайм..должно помочь

Всего записей: 1298 | Зарегистр. 13-02-2006 | Отправлено: 16:27 14-12-2011 | Исправлено: mdid, 16:29 14-12-2011
aidomars



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AnViSe, mdid
Max убираю из времени, ругается "Попытка выполнить запрос, который не включает указанное выражение 'Время' как часть статистической функции или группы."
Last использовать тоже не получается.

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Дабы правильно понять постановку задачи приведи пример исходных данных и требуемый результат запроса.
Заодно укажи SQL движок на всякий случай.

Всего записей: 123 | Зарегистр. 10-11-2008 | Отправлено: 17:19 14-12-2011
dneprcomp



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

Код:
 SELECT TOP 1 ID, [Дата] AS [Max-Дата], [Время] AS [Max-Время]  
FROM table
ORDER BY [Дата] DESC, [Время] DESC, ID DESC

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 18:20 14-12-2011 | Исправлено: dneprcomp, 18:33 14-12-2011
aidomars



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Access 2003, имеем:
1 10.12.2011 18:00    
1 11.12.2011 16:00    
1 11.12.2011 15:00    
2 07.10.2011 17:00    
2 12.12.2011 15:00

 
Получаем:
1 11.12.2011 16:00    
2 12.12.2011 15:00

 
dneprcomp
Оно выводит одну строку, мне ж нужна группировка по ID с максимальной датой и временем.

Всего записей: 982 | Зарегистр. 23-04-2007 | Отправлено: 18:20 14-12-2011 | Исправлено: aidomars, 18:39 14-12-2011
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aidomars
Кстати, какой data type у [Дата] и [Время] ?
Если стринговый, то при большом количестве разнообразных дат и времени ни MAX, ни TOP не дадут верного результата. Нужен datetime.
 
http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

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



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

Всего записей: 982 | Зарегистр. 23-04-2007 | Отправлено: 21:00 14-12-2011
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aidomars
SELECT ID, Max(DT), Max(TM)
FROM ( SELECT ID,DT,(select MAX(TM) FROM T T2 WHERE t2.dt = t1.dt and t2.id = t1.id) as TM FROM T t1  ORDER BY 1)
GROUP BY ID ORDER BY 1;

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 22:26 14-12-2011
aidomars



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuriyRR
У меня одна ж таблица.

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



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

Цитата:
Тип все как положено, краткий формат даты и краткий формат времени

Если у обоих полей data type именно datetime, то какой смысел хранить раздельно?
Все равно внутреннее представление хранит и дату и время для обоих полей.
Места данные занимют одинаково.
Было бы одно поле datetime - дата и время вместе - все было бы гораздо проще.
Выборка бы производилась всего по двум полям простым  
select ID,max([DateAndTime]) as Max_DateAndTime from table  group by по ID
Потом уже можно парсить Max_DateAndTime  как угодно.
А можно и сразу в select-e через функцию datepart  
А с раздельным хранением только через sub select по методу YuriyRR

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 00:20 15-12-2011 | Исправлено: dneprcomp, 00:26 15-12-2011
Jon_Dow

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aidomars
Только связка сама на себя с подзапросом:
Код:
SELECT T2.ID AS,T2.[Max-Дата] AS [Max-Дата],T1.[Время] AS [Время]
FROM  
(SELECT table.ID AS ID,Max(table.[Дата]) AS [Max-Дата] FROM table GROUP BY table.ID) T1,
TABLE T2
WHERE
T2.ID=T1.ID AND T1.[Max-Дата]=T2.[Дата]
Других вариантов(без временных таблиц) нет.

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



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

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



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

Цитата:
Да я уж думал про парсинг

И это наиболее правильный подход. Все что можно посчитать, хранится не должно.
Исключение составляют только такие данные, как финансовые исторические или нечто подобное.

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 08:10 15-12-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 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