Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как переделать запрос, чтобы вывелось то чего нету?


tytus ©   (2007-11-28 12:56:00) 

Есть запрос, возвращающий по каждому номеру количество раз, сколько ентот номер встретился за сутки.

select a.adate, a.SN, Max(a.SNCOL) from
(select adate, subscriber_number SN,
ROW_NUMBER() over(partition by subscriber_number order by subscriber_number) SNCOL
from pcmd_main )a
where a.adate>=To_Date('25.11.2007') and a.adate<=To_Date('28.11.2007')
and a.SN in ('1011011146',
'1011010055',
'1011010082',
....
'1011010171'
)
group by a.adate, a.SN
order by a.adate, a.SN

вот. А нужно чтобы вывелись и те (или только те) номера которых нет в базе! но есть в списке a.Sn in(...)

Вот и думаю - возможно ли такое в принципе, и как такой запрос написать?


Anatoly Podgoretsky   (2007-11-29 13:27:00) [1]

Искать дыры признак плохой проработки проекта и дырка в голове.
Пока из объяснений автора ничего не понятно.


sniknik   (2007-11-29 13:21:00) [2]

> и развернуть таблицу с полной последовательностью
так нему и не нужна полная последовательность, т.е. интервал от сих до сих, а нужен список из задаваемых.
по примеру в 0
'1011011146',
'1011010055',
'1011010082',
....
'1011010171'
три подряд это уже последовательность с возможностью вычислить принцип задания...
и тут видно что номера не последовательные (и даже не просто возрастающие, первое больше всех, а последнее больше остальных приведенных, 2 из 4 с возрастанием... но что это дает? т.е. в общем "разнобой")
полностью последовательные было бы так
'1011011146',
'1011011147',
'1011011148',
....
'1011011171'

т.е. "дыры" искать не надо, надо строить только по тем значениям, что передаются с клиента.


Кщд   (2007-11-29 12:41:00) [3]


> Хм............. долго думал, не придумал.

вариант, предложенный в [12] действительно реализуем в Oracle :)
но в Oracle через магическую dual можно и развернуть таблицу с полной последовательностью


ЮЮ   (2007-11-29 11:20:00) [4]

> [11] Andrey ©   (29.11.07 10:43)

> (ибо если есть - тривиальный лефт джоин).


Чего флудить то в чужой ветке. Создай свою, коль интересно.

Для нахождения первого значения в "дыре" тот же Left JOIN:
SELECT a.Person + 1
 FROM
   Job a
   LEFT JOIN  Job b ON a.Person + 1 = b.Person
 WHERE b.Person IS NULL

А так - можно найти диапазоны:

SELECT a.Person + 1, MIN(b.Person) - 1
 FROM
   Job a
   JOIN  Job b ON a.Person < b.Person
 GROUP BY a.Person
 HAVING  MIN(b.Person) - a.Person > 1
 ORDER BY 1


sniknik   (2007-11-29 11:09:00) [5]

> При том что таблицы с полной последовательностью нет
зато есть временные, в которые можно наложить временно данные,
или просто
SELECT '1011010099' AS Number
UNION
SELECT '1011010115'
не знаю как Oracle (но думаю также), а MSSQL полученный таким образом рекордсет может обрабатывать как и "нормальный".


Andrey   (2007-11-29 10:43:00) [6]

>Кщд ©   (29.11.07 06:10) [9]
>ещё как обойтись)
Хм............. долго думал, не придумал.
Есть таблица с последовательностью значений. Нужно выявить какие значения пропущены. Когда-то давно я долго бился с этой задачей и придумал только через процедуру.
Раскажите пожалуйста как это через один запрос сделать? При том что таблицы с полной последовательностью нет (ибо если есть - тривиальный лефт джоин).


ЮЮ   (2007-11-29 09:33:00) [7]

> тоесть номера 1011010099 НЕТУ физически, но нужно вывести
> строку
> как указано выше - с номером и то что он нигде не встретился,
>
> a.SNCOUNT=0!


А откуда вообще взялись 1011010099 м 1011010115?
Пльзователь каждый день заново забивает в TMemo?

Тогда ощущается отсутствие в твоей модели сущности "Вскоре ожидаемые серийные номера" и соответствующей таблицы :)


Кщд   (2007-11-29 06:10:00) [8]


> Хм... ну раз такие дела, то без хранимой процедуры не обойтись.

ещё как обойтись)
интересно, это MS или Oracle?


Andrey   (2007-11-28 17:24:00) [9]

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


tytus   (2007-11-28 16:58:00) [10]

господа дико извеняюсь...
канечна, HAVING падходит для выборки при группировке, но
... я не так сформулировал ТЗ!
Дело в том, что в <tytus   (28.11.07 13:45) [3] > подразумевалось, что
нумеров типо "25.11.2007 1011010099  0    //сие мне нужна!!!" НЕТУ в базе!
тоесть номера 1011010099 НЕТУ физически, но нужно вывести строку
как указано выше - с номером и то что он нигде не встретился,
a.SNCOUNT=0!
ЕСче раз дико извенияюсь....
Список пишу ричками, тоесть <Ctrl+C> <Ctrl+V>...
Простите если сможете что голову морочил...
у самого голова пухнет -))


Anatoly Podgoretsky   (2007-11-28 16:19:00) [11]

> tytus  (28.11.2007 13:45:03)  [3]

Так это Having


Desdechado   (2007-11-28 14:10:00) [12]

> 25.11.2007 1011010099  0    //сие мне нужна!!!
GROUP BY + HAVING


Sergey13   (2007-11-28 13:57:00) [13]

> [3] tytus   (28.11.07 13:45)
> Мне же нужна только те которые в списке, но чтобы было что-то вроде:

Тогда тебе надо не задавать этот список руками, а получать подзапросом и соединять его с основным. Откуда берется список?

> [3] tytus   (28.11.07 13:45)
> вычитал в доке новую аналитическую функцию ROW_NUMBER(),и решил ее заюзать! имхо может быстрее чем COUNT?

Это я уж потом стал запрос дочитывать, а сначала бросилось в глаза несоответствие. 8-)
А не слишком ты намудрил с ним? Судя по словесному описанию достаточно простого запроса с группировкой.


tytus   (2007-11-28 13:45:00) [14]

>Desdechado ©   (28.11.07 13:24) [1]
а не выгребет ли потом запрос ВСЕ номера, которых нет в списке?
Мне же нужна только те которые в списке, но чтобы было что-то вроде:
a.adate      a.SN           a.SNCOUNT
25.11.2007 1011010055  256
25.11.2007 1011010082  112
25.11.2007 1011010099  0    //сие мне нужна!!!
25.11.2007 1011010102  96
25.11.2007 1011010115  0   //снова сие мне нужна!!!

вот что нужна!

>Sergey13 ©   (28.11.07 13:31) [2]
вычитал в доке новую аналитическую функцию ROW_NUMBER(), и решил
ее заюзать! имхо может быстрее чем COUNT?


Sergey13   (2007-11-28 13:31:00) [15]

> [0] tytus   (28.11.07 12:56)
> сколько ентот номер встретился за сутки.
> Max(a.SNCOL)

Я все время думал, что "сколько раз встретился" это COUNT.


Desdechado   (2007-11-28 13:24:00) [16]

NOT IN


Наверх

Титульная страница Поиск, карта сайта Написать письмо