Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: СУБД и Delphi/Lazarus

  Все выпуски  

RFpro.ru: СУБД и Delphi/Lazarus


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Тимошенко Дмитрий
Статус: Студент
Рейтинг: 625
∙ повысить рейтинг »
Jimhucksly
Статус: 5-й класс
Рейтинг: 383
∙ повысить рейтинг »
LanK
Статус: Профессионал
Рейтинг: 249
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / СУБД и Delphi/Lazarus

Номер выпуска:557
Дата выхода:12.06.2010, 19:00
Администратор рассылки:Gh0stik, Модератор
Подписчиков / экспертов:186 / 83
Вопросов / ответов:1 / 1

Вопрос № 178984: Уважаемые эксперты. Вопрос: Имеется база данных с полями: Kard -символьное поле карточек, Dat1 - дата. Карточка может использоваться несколько раз в день. Количество строк в таблице около 200000. Необходимо составить SQL-запрос, который выводит день ...



Вопрос № 178984:

Уважаемые эксперты. Вопрос: Имеется база данных с полями: Kard -символьное поле карточек, Dat1 - дата. Карточка может использоваться несколько раз в день. Количество строк в таблице около 200000. Необходимо составить SQL-запрос, который выводит день в который максимальное использование карты больше определенного числа раз - Kol и вывести эту дату и максимальное количество раз использований карты в этот день.
То есть должна получиться следующая таблица:
Kard Dat1 (Максимальное Количество использований карты в день)
2345 01.02.2010 4
2347 02.02.2010 5
5879 02.02.2010 5

Имеется Запрос:
Select Kard, Dat1, Count(Kard)
from Base
group by Kard, Dat1
Having Count(Kard) > Kol

Но этот запрос считает по каждому дню. Мне необходимо выбрать только те дни в которых карта использовалась максимальное количество раз т.е что-то Max(Count(Kard))
Или подскажите как это можно реализовать

Отправлен: 07.06.2010, 18:46
Вопрос задал: KazAndr, 1-й класс
Всего ответов: 1
Страница вопроса »


Отвечает Antony Belov, 1-й класс :
Здравствуйте, KazAndr.

Я бы на вашем месте сделал это либо через процедуру выбора, либо через просмотр (можно и с вложеными запросами, но через просмотрт будет быстрее работать, т.к. обычно оптимизатор делает просмотр один раз и потом из него же выбирает).

В случае просмотра на основе вашего запроса просмотр:
create view MAXDATESCOUNT (KARD, DATE1, CARD_COUNT)
as
SELECT Kard, Date1, Count(Kard) as CARD_COUNT
from Base
group by Kard, Date1
Having 3 > 5; /* (5 это ваше число KOL) */


а потом из него уже выбираем (синтаксис FireBird):
Код:
CREATE PROCEDURE S_GETMAXDAYS 
returns (
current_card char(4),
current_card_count integer,
curr ent_date1 date)
as
begin
for SELECT DISTINCT KARD FROM maxdatescount INTO :current_card do
begin
SELECT date1, CARD_COUNT FROM maxdatescount
WHERE (KARD = :current_card) AND
(CARD_COUNT =
(SELECT MAX(CARD_COUNT) FROM maxdatescount WHERE KARD = :current_card))
INTO :current_date1, :current_card_count;
suspend;
end
end

Исправлен второй запрос по просьбе автора ответа
-----
∙ Отредактировал: Лысков Игорь Витальевич, Старший модератор
∙ Дата редактирования: 11.06.2010, 01:38 (время московское)

Ответ отправил: Antony Belov, 1-й класс
Ответ отправлен: 08.06.2010, 10:34
Номер ответа: 261988

Оценка ответа: 5
Комментарий к оценке:
Всем большое спасибо. С кодом разобрался, все работает. На базе в 65000 записей время обработки около 2 секунд

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 261988 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.16 от 26.05.2010

    В избранное