Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задачка на собеседовании.. как такое сотворить?.. 
:(
    Опции темы
Akina
Дата 5.9.2005, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Perchilla @ 4.9.2005, 20:37)
Работает только в том случае, если курс валют не задан на перед...

WHERE vdate <= CURDATE()


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ignat
Дата 5.9.2005, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Kurt, не тот я порядок сортировки влепил, виноват.
Код

SELECT `vdate`, `vname`, `vval` FROM `mtest` GROUP BY `vname` ORDER BY `vdate`DESC



--------------------
Теперь при чем :P
PM   Вверх
Zipo
Дата 5.9.2005, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 4.11.2003

Репутация: нет
Всего: 0



Цитата(Ignat @ 5.9.2005, 09:04)
Kurt, не тот я порядок сортировки влепил, виноват.
Код

SELECT `vdate`, `vname`, `vval` FROM `mtest` GROUP BY `vname` ORDER BY `vdate`DESC

Это логически неправильное решение. Нет смысла делать сортировку после группировки.
Добавлено @ 10:53
Цитата(Kurt @ 4.9.2005, 20:53)
Zipo
Хм.. Ваше решение в MSSQL через процедуру очень интересно. Возьму на вооружение. smile Спасибо. Хотя, конечно, это ограничение:
Цитата
Это конечно при условии, что обновление позиции происходит для всех валют. Т.е. не может быть обновление одной вылюты а потом другой через неделю.

сильно снижает практическое применение такого решения.

Самый главный фактор, что бы не происходило обновление одной валюты чаще чем других. Именно в этом случае процедура отработает неправильно.
В принципе если ставить обновление валют на автомате к примеру с сайта нац. банка, то такая ситуация не произойдет. Не встречал потребностей в ручном обновлении.
PM MAIL   Вверх
Ignat
Дата 5.9.2005, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Цитата(Zipo @ 5.9.2005, 11:48)
Нет смысла делать сортировку после группировки.

Да ну? Вопрос в том, что будет отправлено клиенту.
Вначале выбираются ряды, группируются (т.е. меняется порядок, а не удаление дубликатов значений столбца), затем в пределах группировки производится сортировка, а затем уже DISTINCT.

для сомневающихся:
Цитата
При использовании выражения GROUP BY строки вывода будут сортироваться в соответствии с порядком, заданным в GROUP BY, - так, как если бы применялось выражение ORDER BY для всех полей, указанных в GROUP BY.

источник

Zipo, прежде чем назвать чье-то решение неправильным, следует быть уверенным в своей правоте.

Добавлено @ 12:05
Цитата(Akina @ 5.9.2005, 09:20)
WHERE vdate <= CURDATE()

для MySQL это выглядит WHERE vdate <= NOW()

Это сообщение отредактировал(а) Ignat - 5.9.2005, 12:07


--------------------
Теперь при чем :P
PM   Вверх
Akina
Дата 5.9.2005, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Ignat @ 5.9.2005, 13:03)
для MySQL это выглядит WHERE vdate <= NOW()

не понял... время-то вроде как не нужно...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ignat
Дата 5.9.2005, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Akina, хм... да диалект здесь не при делах.
насколько помню, сравнение в этом случае корректно (date vs datetime). Но по смыслу котировок, могу предположить, что они обновляются куда чаще, чем раз в день smile



--------------------
Теперь при чем :P
PM   Вверх
Akina
Дата 5.9.2005, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Ignat
Я исходил из приведенных в инит-посте данных - там нет времени.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Bikutoru
Дата 5.9.2005, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 1
Всего: 22



Ignat, практика показывает, что ты не совсем прав. Проверял на MySQL 3.23.52-log на данных Kurt'a
Запрос 1.
Код

SELECT `vdate`, `vname`, `vval` FROM `mtest` GROUP BY `vname` ORDER BY `vdate`;

Результат:
02.01.2000 USD 20,5
04.01.2000 EURO 21,5

Запрос №2.
Код

SELECT `vdate`, `vname`, `vval` FROM `mtest` GROUP BY `vname` ORDER BY `vdate` DESC;

Результат:
04.01.2000 EURO 21,5
02.01.2000 USD 20,5

Запрос №3.
Код

SELECT `vdate`, `vname`, `vval` FROM `mtest` GROUP BY `vname` ORDER BY RAND();

Результат:
04.01.2000 EURO 21,5
02.01.2000 USD 20,5
(меняющиеся друг с другом местами)

Так что
Цитата(Ignat @ 5.9.2005, 13:03)
Вопрос в том, что будет отправлено клиенту

остаётся открытым.




--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Ignat
Дата 5.9.2005, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Bikutoru, спасибо.

Zipo, прошу прощения за резкость.

Проверил. Вариант, который у меня заработал:
Код

SELECT * FROM mtest GROUP BY `vname` DESC;

Но не нравится мне он. Очевидно, если поле времени будет заполнено не возрастанием, то результатом будет произвольный порядок. Проверил на 120 записях с группировкой по ~30 значениям.


--------------------
Теперь при чем :P
PM   Вверх
Zipo
Дата 5.9.2005, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 4.11.2003

Репутация: нет
Всего: 0



Ignat:

Все дело в том, что для произведения операции группировки БД необходимо выполнить сортировку по указаному полю для группировки и только после этого БД удаляет дубликаты. Именно по этому в группировке можно указывать направление сортировки (ASC/DESC). Это дает приимущество только в случае если в качестве результата нужно получить сортированные список по полю группировки (т.е. что бы не производить еще 1 операцию сортировки методом ORDER BY).
Вы немного заблудились в реализации алгоритмов БД MySQL.

Цитата
При использовании выражения GROUP BY строки вывода будут сортироваться в соответствии с порядком, заданным в GROUP BY, - так, как если бы применялось выражение ORDER BY для всех полей, указанных в GROUP BY.


Именно об этом говориться в этой цитате.

Цитата
Вначале выбираются ряды, группируются (т.е. меняется порядок, а не удаление дубликатов значений столбца), затем в пределах группировки производится сортировка, а затем уже DISTINCT.


1. Отбираются ряды соотв. условию
2. Сортируются по полям группировки (в указаном направлении ASC/DESC)
3. Удаление дубликатов (DISTINCT)

В приделах групп сортировки не происходит. Все операции происходят в том порядке в котором они написаны в sql выражении. То, что Вы хотите логически неправильно. Этого хотеть не нужно. Абсолютно все БД из соображения скорости будут поступать по указаному мной плану.

Дальше, можете меня хоть застрелить, но я повторюсь:
Это логически неправильное решение. Нет смысла делать сортировку после группировки.

Теперь объясню почему:
ORDER BY всегда будет и выполнялся только после окончательного выполнения GROUP BY (т.е. все дубликаты уже удалены).
Делать сортировку после группировки мне видится логичным только в 1 случае, это в версиях MySQL > 4.0. По полям которые не вошли в группу GROUP BY. Почитайте в этой теме я объяснял логигу группировки MySQL > 4.0. Но это действует только в указаной версии БД, MSSQL уже ругается и выдает ошибку. Но метод реализации группировки в этой БД дает приимущестава, без потери скорости.
Добавлено @ 15:21
Цитата(Ignat @ 5.9.2005, 14:48)
Bikutoru, спасибо.

Zipo, прошу прощения за резкость.

Проверил. Вариант, который у меня заработал:
Код

SELECT * FROM mtest GROUP BY `vname` DESC;

Но не нравится мне он. Очевидно, если поле времени будет заполнено не возрастанием, то результатом будет произвольный порядок. Проверил на 120 записях с группировкой по ~30 значениям.

Этот вариант тоже логически неверен. И работать не будет. Прочитайте мои первые посты в этой теме. Вам должно стать ясно почему так происходит.
PM MAIL   Вверх
Ignat
Дата 5.9.2005, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



2Kurt, перерыл документацию. Судя по всему, то что оттебя хотели:
Код

SELECT * FROM mtest
GROUP BY vname, vdate DESC
GROUP BY vname


Но в MySQL это отпадает. Обидно.
Добавлено @ 15:30
Цитата(Zipo @ 5.9.2005, 16:16)
Этот вариант тоже логически неверен. И работать не будет.

Не сомневаюсь.


--------------------
Теперь при чем :P
PM   Вверх
Ignat
Дата 5.9.2005, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73





--------------------
Теперь при чем :P
PM   Вверх
Kurt
Дата 5.9.2005, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 1
Всего: 36



Цитата(Ignat @ 5.9.2005, 15:26)
2Kurt, перерыл документацию. Судя по всему, то что оттебя хотели:
Код

SELECT * FROM mtest
GROUP BY vname, vdate DESC
GROUP BY vname

Нет. MSSQL ругается:
Цитата
Incorrect syntax near the keyword 'DESC'.

ему второй group by не нравится. smile

Цитата(Akina)
Я исходил из приведенных в инит-посте данных - там нет времени.

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


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Ignat
Дата 5.9.2005, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Kurt, посмотри последний линк. Там хорошо раписано.


--------------------
Теперь при чем :P
PM   Вверх
dm9
Дата 6.9.2005, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: нет
Всего: 137



Или я чего-то не понял, или это трюк "MAX-CONCAT".

Код

SELECT 
LEFT(MAX(CONCAT(vdate, vval)), 10) AS mydate,
vname,
SUBSTRING(MAX(CONCAT(vdate, vval)), 11) AS myval
FROM mtest
GROUP BY vname;


Данной задаче посвящена целая страница в мане по MySQL. Более быстрого решения в один запрос, как утверждается в мане, не существует.

http://www.mysql.ru/docs/man/example-Maxim...-group-row.html

Igant, ты эту ссылку и привёл. Прошу прощения. Надо внимательнее читать.
Но пост удалять не буду, поскольку он содержит готовый запрос...


Это сообщение отредактировал(а) dm9 - 6.9.2005, 10:12
PM MAIL ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0970 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.