SQL запрос

NN13
Новичок
Posts: 53
Joined: 06 Apr 2004 20:09

Post by NN13 »

[quote="GShapievВот этот запрос

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

[/quote]

PS having will do the job, but it's the most unefficient way to use SQL
User avatar
GShapiev
Уже с Приветом
Posts: 2278
Joined: 02 Jan 2001 10:01
Location: MSK; NJ; MA; UAE, Chicago

Post by GShapiev »

NN13 wrote:PS having will do the job, but it's the most unefficient way to use SQL


И чем же это хуже сабселекта?
Гриша
------------
Why would anybody come here if they had a pony? Who leaves a country packed with ponies to come to a non-pony country? It doesn't make sense.. am I wrong?
User avatar
Kotkov
Уже с Приветом
Posts: 342
Joined: 13 Mar 2002 10:01
Location: California

Post by Kotkov »

katit wrote:Короче. У товарища стопудово идет последовательное заполнение, т.е. выборка максимального id для каждого дня даст тот результат.

Вот будет смешно если "стопудовость" измениться. :wink:
Согласен с SVK, что последовательность ID не всегда отображает последовательность во времени.
И вообще при постановке задачи дело идет о времени. Поэтому надо исходить из того, что дано :umnik1: либо доказать, что при такой постановке решение невозможно. :umnik1:
Кто ищет, тот всегда найдет.
Живи своим умом, Пчёла! ©
User avatar
SVK
Уже с Приветом
Posts: 8255
Joined: 23 Jul 2003 03:53
Location: SPb - KW - NY - CT - MD

Post by SVK »

GShapiev wrote:
SVK wrote:
GShapiev wrote:Мне тут такое надо было сделать в MySQL.
Причем в версии без вложенных запросов.

Слабо? ;)

Ну, "охотничьи рассказы"? : :D


см. пост выше.
Правда для Access-а :mrgreen:

Вообще-то ON datevalue(test.date) = datevalue(t2.date) выдает сначала квадрат числа записей за каждый дом за каждый день... То есть при 100 записях в день за каждый дом сначала join создаст по 10000 промежуточных записей для каждого дома за каждый день???.... :pain1:

"А уж утюг я и включать не стал..." (С)Из советского анекдота
LG - Life's good.
But good life is much better.
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Post by katit »

kotkov wrote:Вот будет смешно если "стопудовость" измениться. :wink:
Согласен с SVK, что последовательность ID не всегда отображает последовательность во времени.


Надо искать легкие пути! :umnik1:
Человек не точно сформулировал! :umnik1:
Мы программисты! :mrgreen:
User avatar
GShapiev
Уже с Приветом
Posts: 2278
Joined: 02 Jan 2001 10:01
Location: MSK; NJ; MA; UAE, Chicago

Post by GShapiev »

[quote="SVK]Вообще-то ON datevalue(test.date) = datevalue(t2.date) выдает сначала квадрат числа записей за каждый дом за каждый день... То есть при 100 записях в день за каждый дом сначала join создаст по 10000 промежуточных записей для каждого дома за каждый день???.... :pain1:

"А уж утюг я и включать не стал..." (С)Из советского анекдота[/quote]

Well. Не то, чтобы я спорил и все такое.
Версия базы была без вложенных селектов. Поэтому выбора не было.
И потом чем это хуже. Сделать один Join и потом выборку или на каждую запись делать селект. Я не уверен, что будет быстрее.
Гриша
------------
Why would anybody come here if they had a pony? Who leaves a country packed with ponies to come to a non-pony country? It doesn't make sense.. am I wrong?
User avatar
SVK
Уже с Приветом
Posts: 8255
Joined: 23 Jul 2003 03:53
Location: SPb - KW - NY - CT - MD

Post by SVK »

katit wrote:Короче. У товарища стопудово идет последовательное заполнение, т.е. выборка максимального id для каждого дня даст тот результат.

Товарищ показал первые 5 или 6 строк своей таблицы. Откуда вывод про последовательное заполнение???

Главная проблема таких "выводов", - что в результате их использования ошибка в программе очень долго не будет обнаружена. Все будет работать очень долго, выдавая какие-то результаты, внешне правильные. Этот мини-SQL будет куда-то засунут маленьким винтиком в другой сколько-нибудь серьезный проект. И где-то внутри иногда (возможно, после реорганизации базы, или еще чего...) будут выдаваться неправильные строки, используемые для дальнейшей обработки. Потом кому-то из-за этого банк не даст заем, или ... другое нехорошее. И вероятность того, что эта ошибка обнаружится, крайне мала - ничего же не ломается!

В общем:
"... Враг вступает в город, пленных не щадя,
Оттого что в кузнице не было гвоздя!"

(С) С.Маршак
LG - Life's good.
But good life is much better.
User avatar
GShapiev
Уже с Приветом
Posts: 2278
Joined: 02 Jan 2001 10:01
Location: MSK; NJ; MA; UAE, Chicago

Post by GShapiev »

прям чисто Baterfly Effect :)
Гриша
------------
Why would anybody come here if they had a pony? Who leaves a country packed with ponies to come to a non-pony country? It doesn't make sense.. am I wrong?
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Post by katit »

SVK wrote:Товарищ показал первые 5 или 6 строк своей таблицы. Откуда вывод про последовательное заполнение???


Я смотрю в корень :umnik1:
Он раньше писал про ихнюю аппликуху
Там вроде как по мере поступления данных они вносятся.
Я ведь написал что _я так думаю_
Поэтому если оно так и есть то это будет решение.
User avatar
SVK
Уже с Приветом
Posts: 8255
Joined: 23 Jul 2003 03:53
Location: SPb - KW - NY - CT - MD

Post by SVK »

GShapiev wrote:И потом чем это хуже. Сделать один Join и потом выборку или на каждую запись делать селект. Я не уверен, что будет быстрее.

Такой подход работает только на игрушечных базах. Для того количества данных, которые можно обработать при таком подходе, и база-то не нужна, по большому счету.

На реальной базе из 10^6----10^9----10^12----10^15---... записей..... Хм-м... На Земле может закончиться не только нефть, но и кварцевый песок, прежде чем SQL строящий квадратичные join-ы завершится....
LG - Life's good.
But good life is much better.
User avatar
GShapiev
Уже с Приветом
Posts: 2278
Joined: 02 Jan 2001 10:01
Location: MSK; NJ; MA; UAE, Chicago

Post by GShapiev »

SVK wrote:Такой подход работает только на игрушечных базах. Для того количества данных, которые можно обработать при таком подходе, и база-то не нужна, по большому счету.

На реальной базе из 10^6----10^9----10^12----10^15---... записей..... Хм-м... На Земле может закончиться не только нефть, но и кварцевый песок, прежде чем SQL строящий квадратичные join-ы завершится....


Все конечно так
Но мне что-то не кажется что надо будет всю информацию за все время выдавать
Там же сразу уже условия на дома, да и наверняка на дату.
Гриша
------------
Why would anybody come here if they had a pony? Who leaves a country packed with ponies to come to a non-pony country? It doesn't make sense.. am I wrong?
User avatar
Flying Hen
Уже с Приветом
Posts: 1377
Joined: 14 May 2003 20:37
Location: NY, USA

Post by Flying Hen »

Создать еще одну таблицу. Заполнять ее триггером или встроенной процедурой.
shadow7256
Уже с Приветом
Posts: 9402
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Post by shadow7256 »

чтобы народ не догадывался что происходит. объясню подробнее.

Каждые 15 минут в таблицу дампятся данные для 15 разных домов.

Первое поле (id) - это primary key. Соответственно он создается автоматически и инкрементится тоже автоматически.

ID домов известны заранее. Поле datetime тоже генерится автоматически функцией getdate ().

Дамп заканчивается в какое то определенной время (вставляются последние записи за день).

Вот эти записи (последняя запись за каждый день), для определенного дома мне и нужна.. щас буду пробовать разные варианты, благо накидали их полно здесь

Спасибо
User avatar
Vik_NJ
Уже с Приветом
Posts: 1995
Joined: 29 Dec 2001 10:01
Location: Kiev->...->NYC

Post by Vik_NJ »

А вот извращенное решение... :oops: :roll: :gen1:
select * from whateverTable
where id in
(select convert(integer, substring(
max( convert (char( 8 ), dateField, 112)+
convert (char ( 12 ), dateField, 114)+
convert(char, id)),
21,12))
from whateverTable
group by convert (char( 8 ), dateField, 112)
)
I may grow old, but I refuse to grow up!

Return to “Вопросы и новости IT”