IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   Создание запроса к БД, вычисляющее повторы (http://www.imho.ws/showthread.php?t=101435)

Naked 28.03.2006 08:09

Создание запроса к БД, вычисляющее повторы
 
Проблема такая: есть база (вообще Postgres, но sql язык везде один, так что на это можно не обращать внимания), есть таблица:
| id | phone | operator | region |, с такими полями - phone - номер телефона, operator - принадлежность к оператору, region - принадлежность к региону. Нужна статистика звонков, при этом я делаю так: SELECT count(*) FROM table GROUP BY operator, region, соотвестственно для каждой пары регион-оператор у меня есть количество звонков. Теперь нужно следующее - некоторые телефоны повторяются, так вот нужно вычислить количество повторения для конкретного региона-оператора (сначала вычислять все звонки, а потом делать второй запрос - это очень долго), причем очень хотелось бы это запихнуть в один запрос, сделал вот так: SELECT count(*), count(DISTINCT phone) FROM table ....., но это не то слегка - выбирает количество уникальных номеров...
Помогите, плиз:) :help:

topknot 28.03.2006 11:55

Я не совсем точно понял всё про номера, но предполагаю, что, возможно, тебе нужно уточнить запрос с помощью WHERE region=твой_регион AND WHERE operator=твой_оператор. Количество выбраных записей после этого запроса и будет искомое количество.

psel 28.03.2006 12:47

наверное так:
SELECT region, count(phone) FROM имя таблици GROUP BY region

Slanj 28.03.2006 14:44

Можно попробовать так (таблицу назвал calls)

SELECT COUNT(PHONE) - COUNT((DISTINCT phone))
FROM calls
GROUP BY operator, region;

У меня в аксесе так не сработало (он count(DISTINCT) не переваривает ), но все таки :)

Naked 28.03.2006 17:13

Цитата:

topknot:
Я не совсем точно понял всё про номера, но предполагаю, что, возможно, тебе нужно уточнить запрос с помощью WHERE region=твой_регион AND WHERE operator=твой_оператор
не совсем - представь, что есть служба в которую звонят, записывается время звонка, номер с которого звонили, регион, и оператор. Так вот если чел позвонил 2 (3, 4,5, или более раз), то у него номер с которого он звонит будет одинаковый;) вот мне и нужно выбрать количество номеров, которые позвонили больше одного раза...
Цитата:

psel:
SELECT region, count(phone) FROM имя таблици GROUP BY region
что вы к региону-то привязались :idontnow: GROUP BY сгруппирует по региону и будет по сути количество регионов, грубо говоря, и сколько на каждый регион всего позвонило...
Цитата:

Slanj:
SELECT COUNT(PHONE) - COUNT((DISTINCT phone))
FROM calls
GROUP BY operator, region;
Мой вариант (там где просто count(DISTINC phone)) практически повторяет этот, только это неверно:
допустим есть 20 звонков, из них один чел позвонил 2 раза, другой 3 раза и третий 5 раз, остальные соответственно 10 челов позвонили по 1 разу... Так вот DISTINCT нам даст 13 телефонов, а общее количетсво звонков будет 20, т.е. по этому запросу повторных номеров: 7, а на самом деле их всего 3 (первый, второй и третий челы, которые позвонили больше одного раза)... :rolleyes:
Все равно всем спасибо за участие, продолжаем думать, может кто еще подскажет ;)

Slanj 28.03.2006 17:28

Я просто не совсем понял вопрос. Подумал, что нужно просто получить количество повторных звонков, а не номеров, с которых звонили повторно.

Можно так попробовать.

SELECT Count(ucalls.skolko_zvonili) AS povtornih_telefonov
FROM ( SELECT COUNT(calls.phone) AS skolko_zvonili FROM calls GROUP BY calls.phone ) AS ucalls
WHERE ucalls.skolko_zvonili >1;

Naked 28.03.2006 17:56

Цитата:

Slanj:
Можно так попробовать.
Все бы было хорошо, только в одном запросе нужно сделать, чтобы выводило и всего звонков и повторных;) по отдельности-то все делается ;)

Slanj 28.03.2006 18:09

Ну, это вы уже придираетесь, батенька :p .

Naked 28.03.2006 18:40

Цитата:

Slanj:
Ну, это вы уже придираетесь, батенька.
...где ж это придираюсь?:) Спасибо большое за помощь, просто изначально нужно было, чтобы в одном запросе сразу две вещи делал, и общую сумму, и количество повторных...
А в итоге у меня вот что получилось:
Цитата:

SELECT sum(ucalls.count_p), sum(ucalls.countt) FROM (SELECT
CASE
WHEN count(src)>1 THEN 1
ELSE 0
END AS count_p, count(src) AS countt FROM cdr_log WHERE calldate>='20060328 15:00:00' GROUP BY src) AS ucalls WHERE ucalls.countt>=1
Всем Респект!!!:)


Часовой пояс GMT +4, время: 07:22.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.