![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как переделать запрос, чтобы вывелось то чего нету?
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