powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выбор N любых значений
15 сообщений из 15, страница 1 из 1
Выбор N любых значений
    #39373833
And540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Помогите решить следующую задачку:
Дана таблица ABC, в ней столбцы: FIRM, USER
Нужно посчитать для 10 любых значений FIRM количество значений из USER.
Одному FIRM может принадлежать несколько USER; при расчете количества USER каждый USER должен попадать только 1 раз.
Пример:
FIRM USER
a 1
a 2
a 1
б 4

Результат:
а 2
б 1

Пока я смог подсчитать лишь количество USER по FIRM:
select FIRM, count (FIRM) from ABC group by FIRM

Но как добавить в расчет условия "10 любых значений FIRM" и уникальность USER при расчете - ума не приложу.. :(
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39373917
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
And540,

distinct
subquery
rownum
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39373960
And540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
envAnd540,

distinct
subquery
rownum

вот я и ломаю голову, как distinct USER прилепить к моему запросу... Подзапросом?
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39373978
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
And540,

Код: plsql
1.
2.
3.
select FIRM, count (FIRM) from ABC 
WHERE FIRM IN (SELECT FIRM FROM (SELECT DISTINCT FIRM FROM ABC) WHERE rownum<=10)
group by FIRM
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39374215
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envdistinct
subquery
rownumпо нынешним временам не модно.

And540каждый USER должен попадать только 1 разна что попадать? если, например, в А и Б сидел усер 1.
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39375006
Plohoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ora601And540,

Код: plsql
1.
2.
3.
select FIRM, count (FIRM) from ABC 
WHERE FIRM IN (SELECT FIRM FROM (SELECT DISTINCT FIRM FROM ABC) WHERE rownum<=10)
group by FIRM



Вот так правильнее

select FIRM, COUNT(1)
from (
select distinct FIRM, USER
from ABC
WHERE FIRM IN (SELECT FIRM FROM (SELECT DISTINCT FIRM FROM ABC) WHERE rownum<=10)
)
group by FIRM
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39375021
And540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо большое, всё работает
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39375471
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
And540,
Как-то так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH s (firm, uuser) AS 
(SELECT 'a',  '1'  FROM dual UNION ALL
 SELECT 'a' ,  '2'  FROM dual UNION ALL
 SELECT 'a' ,  '1'  FROM dual UNION ALL
 SELECT 'b' ,  '4'  FROM dual )

SELECT UNIQUE
firm, 
COUNT(DISTINCT UUSER) OVER (PARTITION BY FIRM ) AS cnt_user
  FROM s
  WHERE ROWNUM <=10
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39375475
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moss,

Может даже так будет правильно с учетом вашего условия "случайные 10"
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
WITH s (firm, uuser) AS 
(SELECT 'a',  '1'  FROM dual UNION ALL
 SELECT 'a' ,  '2'  FROM dual UNION ALL
 SELECT 'a' ,  '1'  FROM dual UNION ALL
 SELECT 'b' ,  '4'  FROM dual )
 
SELECT UNIQUE
firm, 
COUNT(DISTINCT UUSER) OVER (PARTITION BY FIRM ) AS cnt_user
  FROM (select * from (select firm, uuser from s order by dbms_random.value) where rownum <=10)
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39375478
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moss,

Выберет 10 случайных rows, вместо 10 любых firms.
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39375488
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через аналитику это могло бы выглядеть так :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH s (firm, uuser) AS 
(SELECT 'a',  '1'  UNION ALL
 SELECT 'a' ,  '2'  UNION ALL
 SELECT 'a' ,  '1'   UNION ALL
 SELECT 'b' ,  '4'   )

  
SELECT firm, cnt_per_firm FROM
 (SELECT firm, 
         count(distinct uuser) over (partition by firm) cnt_per_firm, 
         case when coalesce(lag(firm) over(order by firm),'N/A') <> firm then dense_rank () over(order by firm ) else null end firm_num 
    FROM s) s

WHERE firm_num<=10
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39375535
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601,

>Выберет 10 случайных rows, вместо 10 любых firms.
согласен
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39375536
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601,

только боюсь у вас будет десять первых "уникальных" фирм а не 10 случайных...
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39375540
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mossora601,

только боюсь у вас будет десять первых "уникальных" фирм а не 10 случайных...

В том то и дело, что если "любых" как нужно ТС, то это решение будет лучше за счет отсутствия +1 sort.
...
Рейтинг: 0 / 0
Выбор N любых значений
    #39375556
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601,

может я не верное понял..
Я понял так : взять любых (рандомных) 10 фирм из всех что есть и по ним посчитать к-во уникальных пользователей..
мей би я не прав...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
WITH s (firm, uuser) AS 
(SELECT 'a',  '1'  FROM dual UNION ALL
 SELECT 'a' ,  '2'  FROM dual UNION ALL
 SELECT 'a' ,  '1'   FROM dual UNION ALL
 SELECT 'b' ,  '1'   FROM dual UNION ALL
 SELECT 'c' ,  '1'   FROM dual UNION ALL
 SELECT 'd' ,  '1'   FROM dual UNION ALL
 SELECT 'e' ,  '1'   FROM dual UNION ALL
 SELECT 'f' ,  '1'   FROM dual UNION ALL
 SELECT 'g' ,  '1'   FROM dual UNION ALL
 SELECT 'h' ,  '1'   FROM dual UNION ALL
 SELECT 'i' ,  '1'   FROM dual UNION ALL
 SELECT 'j' ,  '1'   FROM dual UNION ALL
 SELECT 'k' ,  '1'   FROM dual UNION ALL
 SELECT 'l' ,  '1'   FROM dual UNION ALL
 SELECT 'l' ,  '4'  FROM dual )

SELECT UNIQUE firm , cnt_per_firm
FROM ( 
SELECT firm, 
         count(distinct uuser) over (partition by firm) cnt_per_firm
    FROM s  
     WHERE firm IN (
 SELECT firm FROM (( SELECT UNIQUE firm FROM s  order by dbms_random.value))  WHERE ROWNUM<=10) )
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выбор N любых значений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]