Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL-запросик [D5, IB6.x]


Sir Kik ©   (2004-03-09 18:28:00) 

Задачка: дана таблица (id, date, time, id_user). Заносятся записи входов в базу юзверей-когда и во сколько. Вопрос: требуется найти для каждого юзверя idпоследнего входа (именно id, а не число, время). В день м.б. и несколько входов.


Johnmen   (2004-03-11 12:00:00) [1]

>ZrenBy ©   (11.03.04 11:43) [11]

Просто я забыл указать, что мой пост предназначен автору, а не тебе...:)

А если ты намекаешь на время выполнения, то можно развернуть целую философскую дискуссию на эту тему,на тему извращенческих конструкций, на тему переносимости кода, на тему стандартности и универсальности и т.п.
Но не стОит, право...:)


ZrenBy   (2004-03-11 11:43:00) [2]

Так.
Попробовал штаны снять через голову, вот что получилось.


set nocount on
use pubs
go
if(object_id('t') is not null)drop table t
create table t(id int identity(1,1),date datetime,time datetime,id_user char(1))
go

insert into t(date,time,id_user)
select
 dateadd(dd,N+error+ascii(description),'18000101'),
 dateadd(ss,floor(rand()*80000),'00:00:00'),
 substring(description,1,1)
from master..sysmessages join (
select N=100*C+10*B+A from
(select A=0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9)a,
(select B=0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9)b,
(select C=0 union select 1 union select 2 union select 3)c
)Q on 1=1
go

declare @J datetime set @J=getdate()
select T1.id_user,T1.id
from t T1
where T1.date+T1.time=(select max(T2.date+T2.time)
                     from t T2
                     where T1.id_user=T2.id_user)
print 'Johnmen:' print datediff(ms,@J,getdate())
go

declare @Z datetime set @Z=getdate()
select
id_user,
id_fmax=convert(int,substring(max(convert(binary(8),date+time)+convert(binary(4),id)),9,4))
from t group by id_user
print 'ZrenBy:' print datediff(ms,@Z,getdate())
go


PS:
Все, что можно сказать по этому поводу, я прекрасно знаю.
Это чудачества у меня такие :)


Johnmen   (2004-03-10 17:21:00) [3]

Можно ещё штаны через голову снимать...:) Но это чудачество, как минимум...

SELECT T1.id, T1.date, T1.time, T1.id_user
FROM Table T1
WHERE T1.date+T1.time=(SELECT MAX(T2.date+T2.time)
                      FROM Table T2
                      WHERE T1.id_user=T2.id_user)


Sir Kik   (2004-03-10 17:05:00) [4]

В IB выглядит так:

select
id_user,
CAST((copy(max(CAST(date + time AS VARCHAR(24)) || CAST(id AS VARCHAR(10))), 25, 10)) AS int) AS XXX
from table YYY group by id_user

где copy - собственная ф-ция dll, бо плохо у IB со строками

Принцип ZrenBy здесь полностью проходит. Особая ему благодарность.


ZrenBy   (2004-03-10 10:07:00) [5]

>>искать max по строке?

Это уже офф.

Еще раз. Дан прынцып.
Не нравится строка - ищите по чему-нибудь другому,
это не прынцыпиально :)


Fay   (2004-03-10 10:03:00) [6]

А чё за прынцып такой - искать max по строке?


ZrenBy   (2004-03-10 09:57:00) [7]

>>Fay ©   (10.03.04 07:59) [3]

Дан прынцып


Жук   (2004-03-10 09:27:00) [8]


> Johnmen ©   (10.03.04 09:16) [4]
> Это зависит от определения "последнего входа"

Главное, чтобы юзверь вошёл, а уж последнимего вход мы сами сделаем :-)


Johnmen   (2004-03-10 09:16:00) [9]

Это зависит от определения " последнеговхода"


Fay   (2004-03-10 07:59:00) [10]

2ZrenBy ©   (09.03.04 18:40) [2]
IB не очень хорошо поддерживает T-SQL. 8)


ZrenBy   (2004-03-09 18:40:00) [11]

select
id_user,
id_fmax=substring(max(convert(char(23),date+time,120)+convert(char(10),id)),24,10)
from table group by id_user


Соловьев   (2004-03-09 18:31:00) [12]

select id_user, max(id)
from table
group by id_user


Наверх

Титульная страница Поиск, карта сайта Написать письмо