Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
3-1187669628
Yurikon
2007-08-21 08:13
2007.12.23
Проблема с версиями драйверов ODBC


2-1195900395
Igor Zorkov
2007-11-24 13:33
2007.12.23
Как поместить MainMenu на ControlBar


15-1195624952
Stanislav_
2007-11-21 09:02
2007.12.23
Админу


3-1187100144
Мистик
2007-08-14 18:02
2007.12.23
прямой доступ


2-1196426968
webpauk
2007-11-30 15:49
2007.12.23
Папка верхнего уровня





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский