Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2015, 10:28   #1
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию 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, 10:38   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
SELECT Cid,MAX(ftime) FROM tmain GROUP BY Cid HAVING MAX(ftime)<current_date-40
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.03.2015, 11:00   #3
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

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

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

Хотел в запрос добавить 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 в 12:37.
Yuran вне форума Ответить с цитированием
Старый 11.03.2015, 12:05   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

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

предположу
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, 15:41   #6
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

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

Имеется таблица
Код:
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, 17:18   #7
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

Готово


Код:
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 в 17:21.
Yuran вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычислить сумму элементов массива М(15), значения которых лежат в введенном с клавиатуры диапазоне [X, Y] ( C++) X-rays1 Помощь студентам 0 30.12.2014 05: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