Причем в версии без вложенных запросов.
Слабо?
![Wink ;)](./images/smilies/icon_wink.gif)
SVK wrote:NN13 wrote:Я отметил в своем первом сообщении, что с id будет работать быстрее, если это identity field, а тогда оно упорядочено.
1) Identity зависит от реализации. Никто не гарантирует, что всегда будет по возрастанию. Это - как надеяться, что записи будут выданы по порядку даже без ORDER BY - "потому что они по порядку добавлялись". Иногда такое проходило...
2) Например в той же DB2 можно явно указать другой порядок генерации identity. Иногда нужно его менять, для оптимального partitioning, или еще зачем... Могут его поменять и при реорганизации базы, и много еще чего...
3) Ниоткуда также не следует, что записи а базу добавлялись в хронологическом порядке. Стоит только один раз добавить "вчерашнюю" запись, и вся та логика с ID может опять пойти насмарку
Не стоит программе выборки полагаться на ненужные предположения... Рано или поздно это "вдруг" перестанет работать :nono#:NN13 wrote:А так:
select t1.* from mytable t1
inner join
(select max(time)as "time", convert(varchar(10), time, 101) as "day"
from mytable group by convert(varchar(10), time, 101)) t2
on t1.time=t2.time
дает как раз "последнюю запись для каждого (или нужного) значения в каждом дне".
По-моему, тут будет выдана "последняя запись за каждый день", без какой-либо связи с возможными значениями HouseID (или TEXT в моем примере). А нужно "последнюю в день для каждого HouseID"
А затем WHERE из примера в предыдущем посте просто отсеет те записи, где заданный HouseID не был последний за день? Или я чего-то не понимаю?NN13 wrote:Я вот хотел спросить про DB2 - там такой оптимизатор умный, что можно позволить себе писать "where (...,...) in (...) вместо inner join?
Для MS SQL это определенно не пройдет.
Не во всех версиях DB2 это работало.
В принципе, если не работает, то это тоже заменить на JOIN по двум ключам...
NN13 wrote:В MS SQL identity всегда увеличивается (даже если вставлять "вчерашнюю" запись), но использовать его имеет смысл только если datetime работает медленно.
Code: Select all
100 2000-01-01-11:00:00 House1
200 2000-01-01-12:00:00 House1
300 2000-01-01-13:00:00 House1
400 2000-01-01-14:00:00 House1
500 2000-01-01-15:00:00 House1
Code: Select all
800 2000-01-02-11:30:00 House1
900 2000-01-02-12:30:00 House1
1000 2000-01-01-12:30:00 House1
1100 2000-01-01-11:30:00 House1
shadow7256 wrote:Есть таблица
мне надо выбрать последнюю запись из каждого дня. То есть результатом выборки будут записи с id равными 2,4 и 5
Как такое написать?
shadow7256 wrote:да писать то и нечего.. не работает запрос этот как надо.
Code: Select all
id date house
1 7/4/2004 3:23:00 PM h1
10 7/4/2004 3:23:00 PM h1
11 7/5/2004 3:24:00 PM h1
12 7/5/2004 3:24:00 PM h2
13 7/5/2004 3:24:00 PM h2
14 7/5/2004 3:24:00 PM h2
15 7/5/2004 3:24:00 PM h2
16 7/5/2004 3:24:01 PM h1
17 7/5/2004 3:24:00 PM h1
18 7/5/2004 3:24:00 PM h2
19 7/5/2004 3:34:00 PM h2
2 7/4/2004 3:26:00 PM h1
20 7/5/2004 3:15:00 PM h2
21 7/5/2004 3:20:00 PM h1
22 7/5/2004 3:24:00 PM h1
3 7/4/2004 3:23:00 PM h2
4 7/4/2004 3:23:00 PM h2
5 7/4/2004 3:25:00 PM h2
6 7/4/2004 3:23:00 PM h1
7 7/4/2004 3:23:00 PM h1
8 7/4/2004 3:23:00 PM h1
9 7/4/2004 3:23:00 PM h1
Code: Select all
SELECT test.id, test.date, test.house
FROM test INNER JOIN test AS t2 ON datevalue(test.date) = datevalue(t2.date) and test.house = t2.house
GROUP BY test.id, test.date, test.house
having test.date = max(t2.date)
order by test.date
Code: Select all
id date house
5 7/4/2004 3:25:00 PM h2
2 7/4/2004 3:26:00 PM h1
16 7/5/2004 3:24:01 PM h1
19 7/5/2004 3:34:00 PM h2
SVK wrote:GShapiev wrote:Мне тут такое надо было сделать в MySQL.
Причем в версии без вложенных запросов.
Слабо?
Ну, "охотничьи рассказы"? :![]()
SVK wrote:kotkov wrote:select * from TABLE
where TABLE.TIMEFIELD in (
select max(TIMEFIELD) from TABLE
group by trunc(TIMEFIELD))
GROUP BY <expression> мало где реализовано? У меня навскидку таких нет.
shadow7256 wrote:да писать то и нечего.. не работает запрос этот как надо. Где Дима то? Или Тенгиз? По моему только они помогут :cry:
Code: Select all
if exists (select * from dbo.sysobjects where id = object_id(N'[ttest]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [ttest]
GO
CREATE TABLE [ttest] (
[ID] [int] NOT NULL ,
[time] [datetime] NOT NULL
) ON [PRIMARY]
GO
insert ttest ([id], [time]) values (1, '2004-10-07 1:10')
insert ttest ([id], [time]) values (2, '2004-10-07 23:10')
insert ttest ([id], [time]) values (3, '2004-10-08 16:15')
insert ttest ([id], [time]) values (4, '2004-10-08 17:15')
insert ttest ([id], [time]) values (5, '2004-10-09 10:00')
select * from ttest
select max([id])
from ttest
group by CONVERT(Char(10), [time], 101)