Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 11.03.2015, 11:28   #1
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
Репутация: 10
По умолчанию SQL выбрать записи в диапазоне времени которых нет в другом диапазоне

Всем привет.
Помогите пожалуйста составить запрос который выберет записи с таймкодом из одного диапазона времени и которых нет в другом диапазоне времени

Пробовал так
Код:

SELECT Сid, ftime FROM tmain WHERE ftime<current_date-40 AND NOT EXISTS (SELECT Сid, ftime FROM tmain WHERE ftime BETWEEN current_date-40 AND current_date)

То есть нужно сделать выборку СID-ов (Client id - Это поле ИДов из другой таблицы) которые посещали магазин более 40 дней назад И НЕ ПОСЕЩАЛИ В ПОСЛЕДНИЕ 40 дней.

Запрос выше дает NULL

Спасибо
Yuran вне форума   Ответить с цитированием
Старый 11.03.2015, 11:38   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,959
Репутация: 6285
По умолчанию

Код:

SELECT Cid,MAX(ftime) FROM tmain GROUP BY Cid HAVING MAX(ftime)<current_date-40

__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума   Ответить с цитированием
Старый 11.03.2015, 12:00   #3
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
Репутация: 10
По умолчанию

Надо же! Как все просто оказалось! Отдыхать больше нужно!

Спасибо большое за помощь и быстрый ответ
...
Поспешил я радоваться

Хотел в запрос добавить ID записи и все поломалось

При вашем варианте
Код:

SELECT Cid,MAX(ftime) FROM tmain GROUP BY Cid HAVING MAX(ftime)<current_date-40

запрос выдает 380 записей

Если я добавляю id...
Код:

SELECT id,Cid,MAX(ftime) FROM tmain GROUP BY id,Cid HAVING MAX(ftime)<current_date-40

Запрос выдает более 700 записей

Последний раз редактировалось Stilet; 11.03.2015 в 13:37.
Yuran вне форума   Ответить с цитированием
Старый 11.03.2015, 13:05   #4
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,959
Репутация: 6285
По умолчанию

А что хотел? Это уже другая не озвученная задача
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума   Ответить с цитированием
Старый 11.03.2015, 15:03   #5
Toxa
Участник клуба
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Адрес: Таганрог
Сообщений: 518
Репутация: 211

icq: 240909912
По умолчанию

предположу
id - уникальный идентификатор таблицы tmain
тогда
Код:

select t.id,t2.cid,t2.ftime from tmain t, 
(SELECT Cid,MAX(ftime) as ftime FROM tmain GROUP BY id,Cid HAVING MAX(ftime)<current_date-40) t2
where t.cid = t2.cid and t.ftime = t2.ftime

__________________
Пишу на Delphi за еду
Toxa вне форума   Ответить с цитированием
Старый 11.03.2015, 16:41   #6
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
Репутация: 10
По умолчанию

Сейчас объясню задачу

Имеется таблица
Код:

TMAIN

с полями
Код:

id :integer - уникальный id записи
clientid :integer - id клиента из табл TCLIENT
regdate :TDATE - дата регистрации покупки
chtokupil :varchar(250) - список купленных товаров или услуг
nasummu :integer - сумма покупки
dopinfo :varchar(500) - дополнительная информация

Также имеется таблица
Код:

TCLIENT

с полями
Код:

id : integer -  уникальный id клиента 
cname : varchar(50) - Имя клиента
ctel : varchar (25) - телефон клиента

здесь tmain.clientid=tclient.id

Планировал создать lookupfield на таблицу TCLIENT при удачном запросе к TMAIN

В результате нужно получить
Код:

Имя клиента
телефон клиента
дата покупки - последняя
что купил
на сумму
дополнительная информация

при условии что
Код:

последняя покупка данного клиента была сделана более 40 дней назад на сумму больше нуля


Щас попробую осмыслить пример который ТОХА прислал
Yuran вне форума   Ответить с цитированием
Старый 11.03.2015, 18:18   #7
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
Репутация: 10
По умолчанию

Готово


Код:

select t.id, t.money, t.regservice ,t2.clientname, t2.ftime, TCLIENT.name, tclient.id from tmain t,
(SELECT clientname,MAX(regdate) as ftime FROM tmain GROUP BY clientname HAVING MAX(regdate)<current_date-40) t2,
tclient
where t.clientname = t2.clientname and t.regdate = t2.ftime AND tclient.id=t.clientname and t.money>0 and tclient.id>3

Спасибо всем за помощь.

Разобрался с примером от Тоха
Выше запрос который выводит мне все необходимые ПОСЛЕДНИЕ записи в заданном диапазоне времени и которых нет в другом диапазоне времени

Тему можно закрывать

Последний раз редактировалось Yuran; 11.03.2015 в 18:21.
Yuran вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычислить сумму элементов массива М(15), значения которых лежат в введенном с клавиатуры диапазоне [X, Y] ( C++) X-rays1 Помощь студентам 0 30.12.2014 06:23
выбор в одном диапазоне, а поиск в другом pavelitel Microsoft Office Excel 3 07.10.2012 00:37
Трехзначные числа,в десятичной записи которых нет одинаковых цифр X@OC Общие вопросы по Java, Java SE, Kotlin 6 10.04.2012 18:26
Найти все числа в диапазоне от 0 до 100, квадраты которых заканчиваются той же цифрой, что и само число (Delphi) 'studentka' Помощь студентам 5 29.11.2011 17:10
Определение времени в диапазоне Mouse123 Общие вопросы Delphi 9 12.05.2009 13:59


05:16.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru