![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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