Текущий архив: 2007.12.23;
Скачать: CL | DM;
ВнизКак переделать запрос, чтобы вывелось то чего нету? Найти похожие ветки
← →
tytus (2007-11-28 12:56) [0]Есть запрос, возвращающий по каждому номеру количество раз, сколько ентот номер встретился за сутки.
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(...)
Вот и думаю - возможно ли такое в принципе, и как такой запрос написать?
← →
Desdechado © (2007-11-28 13:24) [1]NOT IN
← →
Sergey13 © (2007-11-28 13:31) [2]> [0] tytus (28.11.07 12:56)
> сколько ентот номер встретился за сутки.
> Max(a.SNCOL)
Я все время думал, что "сколько раз встретился" это COUNT.
← →
tytus (2007-11-28 13:45) [3]>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:57) [4]> [3] tytus (28.11.07 13:45)
> Мне же нужна только те которые в списке, но чтобы было что-то вроде:
Тогда тебе надо не задавать этот список руками, а получать подзапросом и соединять его с основным. Откуда берется список?
> [3] tytus (28.11.07 13:45)
> вычитал в доке новую аналитическую функцию ROW_NUMBER(),и решил ее заюзать! имхо может быстрее чем COUNT?
Это я уж потом стал запрос дочитывать, а сначала бросилось в глаза несоответствие. 8-)
А не слишком ты намудрил с ним? Судя по словесному описанию достаточно простого запроса с группировкой.
← →
Desdechado © (2007-11-28 14:10) [5]> 25.11.2007 1011010099 0 //сие мне нужна!!!
GROUP BY + HAVING
← →
Anatoly Podgoretsky © (2007-11-28 16:19) [6]> tytus (28.11.2007 13:45:03) [3]
Так это Having
← →
tytus (2007-11-28 16:58) [7]господа дико извеняюсь...
канечна, HAVING падходит для выборки при группировке, но
... я не так сформулировал ТЗ!
Дело в том, что в <tytus (28.11.07 13:45) [3] > подразумевалось, что
нумеров типо "25.11.2007 1011010099 0 //сие мне нужна!!!" НЕТУ в базе!
тоесть номера 1011010099 НЕТУ физически, но нужно вывести строку
как указано выше - с номером и то что он нигде не встретился,
a.SNCOUNT=0!
ЕСче раз дико извенияюсь....
Список пишу ричками, тоесть <Ctrl+C> <Ctrl+V>...
Простите если сможете что голову морочил...
у самого голова пухнет -))
← →
Andrey © (2007-11-28 17:24) [8]Хм... ну раз такие дела, то без хранимой процедуры не обойтись.
Хранимка перебирает все записи отсортированые по порядку, если находит дырку - выплевывает наружу результат. Все щасливы.
← →
Кщд © (2007-11-29 06:10) [9]
> Хм... ну раз такие дела, то без хранимой процедуры не обойтись.
ещё как обойтись)
интересно, это MS или Oracle?
← →
ЮЮ © (2007-11-29 09:33) [10]> тоесть номера 1011010099 НЕТУ физически, но нужно вывести
> строку
> как указано выше - с номером и то что он нигде не встретился,
>
> a.SNCOUNT=0!
А откуда вообще взялись 1011010099 м 1011010115?
Пльзователь каждый день заново забивает в TMemo?
Тогда ощущается отсутствие в твоей модели сущности "Вскоре ожидаемые серийные номера" и соответствующей таблицы :)
← →
Andrey © (2007-11-29 10:43) [11]>Кщд © (29.11.07 06:10) [9]
>ещё как обойтись)
Хм............. долго думал, не придумал.
Есть таблица с последовательностью значений. Нужно выявить какие значения пропущены. Когда-то давно я долго бился с этой задачей и придумал только через процедуру.
Раскажите пожалуйста как это через один запрос сделать? При том что таблицы с полной последовательностью нет (ибо если есть - тривиальный лефт джоин).
← →
sniknik © (2007-11-29 11:09) [12]> При том что таблицы с полной последовательностью нет
зато есть временные, в которые можно наложить временно данные,
или просто
SELECT "1011010099" AS Number
UNION
SELECT "1011010115"
не знаю как Oracle (но думаю также), а MSSQL полученный таким образом рекордсет может обрабатывать как и "нормальный".
← →
ЮЮ © (2007-11-29 11:20) [13]> [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
← →
Кщд © (2007-11-29 12:41) [14]
> Хм............. долго думал, не придумал.
вариант, предложенный в [12] действительно реализуем в Oracle :)
но в Oracle через магическую dual можно и развернуть таблицу с полной последовательностью
← →
sniknik © (2007-11-29 13:21) [15]> и развернуть таблицу с полной последовательностью
так нему и не нужна полная последовательность, т.е. интервал от сих до сих, а нужен список из задаваемых.
по примеру в 0
"1011011146",
"1011010055",
"1011010082",
....
"1011010171"
три подряд это уже последовательность с возможностью вычислить принцип задания...
и тут видно что номера не последовательные (и даже не просто возрастающие, первое больше всех, а последнее больше остальных приведенных, 2 из 4 с возрастанием... но что это дает? т.е. в общем "разнобой")
полностью последовательные было бы так
"1011011146",
"1011011147",
"1011011148",
....
"1011011171"
т.е. "дыры" искать не надо, надо строить только по тем значениям, что передаются с клиента.
← →
Anatoly Podgoretsky © (2007-11-29 13:27) [16]Искать дыры признак плохой проработки проекта и дырка в голове.
Пока из объяснений автора ничего не понятно.
Страницы: 1 вся ветка
Текущий архив: 2007.12.23;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.043 c