Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите написать select / 25 сообщений из 49, страница 1 из 2
19.12.2017, 07:00
    #39571752
alx71
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
Есть таблица
ID C1 C2
1 A B
1 C D
1 E F
2 G H
3 I J
3 K L
4 A B
4 C D
4 E F

Необходимо выбрать ID для полностью одинаковых наборов (без учета порядка строк), например, для моего примера должны быть выбраны ID 1 и 4.
...
Рейтинг: 0 / 0
19.12.2017, 07:23
    #39571765
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
Сгруппируй по всем полям и выведи ID?

Проблема в чем?
...
Рейтинг: 0 / 0
19.12.2017, 07:24
    #39571767
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
+ having(count(id))>1
...
Рейтинг: 0 / 0
19.12.2017, 08:38
    #39571799
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
alx71,
Код: plsql
1.
2.
select id, c1, c2 from table t1 
where exists (select * from table t2 where t2.c1 = t1.c1 and t2.c2 = t1.c2 and t2.id <> t1.id)
...
Рейтинг: 0 / 0
19.12.2017, 08:54
    #39571806
шК0ДЕР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
Dshedoo, забавно)) попробуйте выполнить свой запрос...
...
Рейтинг: 0 / 0
19.12.2017, 09:05
    #39571810
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
шК0ДЕРDshedoo, забавно)) попробуйте выполнить свой запрос...

А что не так?
Возвращает набор строк, где разные ID и одинаковые буквы.
Если ему нужны будут просто 2 ID, то он всегда может переписать на distinct ID.
...
Рейтинг: 0 / 0
19.12.2017, 09:09
    #39571812
alx71
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
Dshedoo,

для случая

ID C1 C2
1 A B
1 C D
1 E F
2 G H
3 I J
3 K L
4 A B
4 C D

Ваш запрос отдаст 1 и 4, хотя не должен отдать ничего.
...
Рейтинг: 0 / 0
19.12.2017, 09:17
    #39571815
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
alx71Dshedoo,

для случая

ID C1 C2
1 A B
1 C D
1 E F
2 G H
3 I J
3 K L
4 A B
4 C D

Ваш запрос отдаст 1 и 4, хотя не должен отдать ничего.
Святые воробушки, это вам в универе такие задачки задают? Они там озверели?
...
Рейтинг: 0 / 0
19.12.2017, 09:20
    #39571817
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
Dshedoo,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with q as (select 1 as id, 'A' as c1, 'B' as c2 from dual union all
select 1, 'C', 'D' from dual union all
select 1, 'E', 'F' from dual union all
select 2, 'G', 'H' from dual union all
select 3, 'I', 'J' from dual union all
select 3, 'K', 'L' from dual union all
select 4, 'A', 'B' from dual union all
select 4, 'C', 'D' from dual union all
select 4, 'E', 'F' from dual)

, w as (select id, listagg(c1,'-') WITHIN GROUP (order by c1) as c1, listagg(c2,'-') WITHIN GROUP (order by c2) as c2 from q
group by id)

select * from w t1 where exists (select * from w t2 where t1.id <> t2.id and t1.c1 = t2.c1 and t1.c2 = t2.c2)
...
Рейтинг: 0 / 0
19.12.2017, 09:50
    #39571828
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
Dshedoo
Код: plsql
1.
listagg(c1,'-') WITHIN GROUP (order by c1) as c1, listagg(c2,'-') WITHIN GROUP (order by c2) as c2

под "полностью одинаковых" стоит понимать попарное совпадение а не независимая сортировка столбцов.
...
Рейтинг: 0 / 0
19.12.2017, 10:08
    #39571831
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
-2-Dshedoo
Код: plsql
1.
listagg(c1,'-') WITHIN GROUP (order by c1) as c1, listagg(c2,'-') WITHIN GROUP (order by c2) as c2

под "полностью одинаковых" стоит понимать попарное совпадение а не независимая сортировка столбцов.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with q as (select 1 as id, 'A' as c1, 'B' as c2 from dual union all
select 1, 'C', 'D' from dual union all
select 1, 'E', 'F' from dual union all
select 2, 'G', 'H' from dual union all
select 3, 'I', 'J' from dual union all
select 3, 'K', 'L' from dual union all
select 4, 'A', 'B' from dual union all
--select 4, 'A', '' from dual union all
--select 4, '', 'B' from dual union all
select 4, 'E', 'F' from dual union all
select 4, 'C', 'D' from dual)

, w as (select id, c1, c2, dense_rank() over(partition by id order by c1, c2) as c3 from q)
, e as (select id, listagg(c3||'-'||c1||'-'||c2,'/') WITHIN GROUP (order by c1) as c4 from w
group by id)

select * from e t1 where exists (select * from e t2 where t1.id <> t2.id and t1.c4 = t2.c4 )
...
Рейтинг: 0 / 0
19.12.2017, 10:11
    #39571836
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
Dshedoo,

>>order by c1 := order by c3
...
Рейтинг: 0 / 0
19.12.2017, 10:44
    #39571848
Загги
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
Код: 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.
25.
26.
27.
28.
29.
with src as (
select 1 "id", 'A' "c1", 'B' "c2" from dual union all
select 1, 'C', 'D' from dual union all
select 1, 'E', 'F' from dual union all
select 2, 'G', 'H' from dual union all
select 3, 'I', 'J' from dual union all
select 3, 'K', 'L' from dualunion all
select 4, 'A', 'B' from dual union all
select 4, 'C', 'D' from dual union all
select 4, 'E', 'F' from dual ),
unk as ( select distinct "id" from src ) 
select *
from unk u1
inner join unk u2
on (u1."id" < u2."id")
where not exists ( select s1."c1", s1."c2" 
                   from src s1 
                   where s1."id" = u1."id" 
                   minus
                   select s2."c1", s2."c2" 
                   from src s2 
                   where s2."id" = u2."id" )
  and not exists ( select s2."c1", s2."c2" 
                   from src s2 
                   where s2."id" = u2."id"
                   minus
                   select s1."c1", s1."c2" 
                   from src s1 
                   where s1."id" = u1."id" ) 
...
Рейтинг: 0 / 0
19.12.2017, 10:56
    #39571854
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
Если уложишься в длину varchar2
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
column lst format a50

with s (id, c1, c2) as (
select 1, 'A', 'B' from dual union all
select 1, 'C', 'D' from dual union all
select 1, 'E', 'F' from dual union all
select 2, 'G', 'H' from dual union all
select 3, 'I', 'J' from dual union all
select 3, 'K', 'L' from dual union all
select 4, 'A', 'B' from dual union all
select 4, 'C', 'D' from dual union all
select 4, 'E', 'F' from dual)
select id, listagg('[' || c1 || '-' || c2 || ']') within group (order by c1, c2) lst
from s
group by id;

        ID LST
---------- --------------------------------------------------
         1 [A-B][C-D][E-F]
         2 [G-H]
         3 [I-J][K-L]
         4 [A-B][C-D][E-F]

Ну а дальше группируй по lst, как тебе надо.
...
Рейтинг: 0 / 0
19.12.2017, 11:20
    #39571870
alx71
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
Спасибо всем откликнувшемся!
...
Рейтинг: 0 / 0
19.12.2017, 12:57
    #39571941
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
alx71,

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with s (id, c1, c2) as (
select 1, 'A', 'B' from dual union all
select 1, 'C', 'D' from dual union all
select 1, 'E', 'F' from dual union all
select 2, 'G', 'H' from dual union all
select 3, 'I', 'J' from dual union all
select 3, 'K', 'L' from dual union all
select 4, 'A', 'B' from dual union all
select 4, 'C', 'D' from dual union all
select 4, 'E', 'F' from dual)

select from_id, to_id
from (select s1.id from_id, s2.id to_id, sum(case when s1.c1 = s2.c1 and s1.c2 = s2.c2 then 1 end) sm, count(s1.id) over (partition by S2.id)  cnt
       from s s1, s s2
      where s1.id != s2.id
      group by s1.id, s2.id) t
where sm = cnt
...
Рейтинг: 0 / 0
19.12.2017, 13:15
    #39571956
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
MaximaXXL,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with s (id, c1, c2) as (
select 1, 'A', 'B' from dual union all
select 1, 'C', 'D' from dual union all
select 1, 'E', 'F' from dual union all
select 1, 'x', 'F' from dual union all
select 2, 'G', 'H' from dual union all
select 3, 'I', 'J' from dual union all
select 3, 'K', 'L' from dual union all
select 4, 'A', 'B' from dual union all
select 4, 'C', 'D' from dual union all
select 4, 'E', 'F' from dual)
...



.....
stax
...
Рейтинг: 0 / 0
19.12.2017, 13:45
    #39571978
Помогите написать select
with a as
(select 1 id, 'A' c1, 'B' c2
from dual
union
select 1, 'C', 'D'
from dual
union
select 1, 'E', 'F'
from dual
union
select 2, 'G', 'H'
from dual
union
select 3, 'I', 'J'
from dual
union
select 3, 'K', 'L'
from dual
union
select 4, 'A', 'B'
from dual
union
select 4, 'C', 'D'
from dual
union
select 4, 'E', 'F'
from dual)
select distinct id
from (select count(id) over(partition by c1, c2) cnt, id from a)
where cnt > 1
...
Рейтинг: 0 / 0
19.12.2017, 13:52
    #39571983
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
Stax,

Так должно сработать, хотя на livesql.oracle.com maintenance и не могу проверить =( :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with s (id, c1, c2) as (
select 1, 'A', 'B' from dual union all
select 1, 'C', 'D' from dual union all
select 1, 'E', 'F' from dual union all
select 2, 'G', 'H' from dual union all
select 3, 'I', 'J' from dual union all
select 3, 'K', 'L' from dual union all
select 4, 'A', 'B' from dual union all
select 4, 'C', 'D' from dual union all
select 4, 'E', 'F' from dual)
, s_org (select count(id) over (partition by id) cnt, s.* from s)

select s1.id from_id, s2.id to_id
       from s_org s1, s_org s2
      where s1.id != s2.id
      and s1.cnt = s2.cnt
      group by s1.id, s2.id, s1.cnt
having sum(case when s1.c1 = s2.c1 and s1.c2 = s2.c2 then 1 end) = s1.cnt
...
Рейтинг: 0 / 0
19.12.2017, 13:57
    #39571987
Помогите написать select
а что предпочтительнее, дистинкт или груп бай ? мой первый пример или этот второй ?

Код: 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.
25.
26.
27.
28.
29.
30.
31.
with a as
 (select 1 id, 'A' c1, 'B' c2
    from dual
  union
  select 1, 'C', 'D'
    from dual
  union
  select 1, 'E', 'F'
    from dual
  union
  select 2, 'G', 'H'
    from dual
  union
  select 3, 'I', 'J'
    from dual
  union
  select 3, 'K', 'L'
    from dual
  union
  select 4, 'A', 'B'
    from dual
  union
  select 4, 'C', 'D'
    from dual
  union
  select 4, 'E', 'F'
    from dual)
select id
  from (select count(id) over(partition by c1, c2) cnt, id from a)
 where cnt > 1
 group by id
...
Рейтинг: 0 / 0
19.12.2017, 13:58
    #39571990
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
ДобрыйМакс,

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
with a as
(select 1 id, 'A' c1, 'B' c2
from dual
union
select 1, '*', '*'
from dual
union
select 1, 'C', 'D'
from dual
union
select 1, 'x', 'x'
from dual
union
select 1, 'E', 'F'
from dual
union
select 2, 'G', 'H'
from dual
union
select 2, 'I', 'J'
from dual
union
select 5, 'K', 'L'
from dual
union
select 5, 'x', 'y'
from dual
union
select 4, 'A', 'B'
from dual
union
select 4, 'C', 'D'
from dual
union
select 4, 'y', 'y'
from dual
union
select 4, '+', '+'
from dual
union
select 4, 'E', 'F'
from dual)
select distinct id
from (select count(id) over(partition by c1, c2) cnt, id from a)
where cnt > 1
/



....
stax
...
Рейтинг: 0 / 0
19.12.2017, 14:00
    #39571992
Помогите написать select
stax,
не понял последнее сообщение

с выделенными строками

select 1, '*', '*'

и

select 4, '+', '+'
...
Рейтинг: 0 / 0
19.12.2017, 14:09
    #39572005
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать select
ДобрыйМакс,

1 и 4 -разные наборы

Код: plsql
1.
2.
3.
4.
5.
6.
7.
 45* where cnt > 1
SQL> /

        ID
----------
         1
         4



.....
stax
...
Рейтинг: 0 / 0
19.12.2017, 14:13
    #39572008
Помогите написать select
StaxДобрыйМакс,

1 и 4 -разные наборы

Код: plsql
1.
2.
3.
4.
5.
6.
7.
 45* where cnt > 1
SQL> /

        ID
----------
         1
         4



.....
stax

но при этом есть с такими id и одинаковые наборы из твоего примера

select 1, 'C', 'D'
select 4, 'C', 'D'

и с EF так же

автору нужно вывести id, если есть одинаковый набор, хотя бы один, но не сказано, что нужно исключить, есть есть хотя бы один неодинаковый с таким id

верно?
...
Рейтинг: 0 / 0
19.12.2017, 14:14
    #39572010
Помогите написать select
так а что лучше - dictinct или group by таки?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите написать select / 25 сообщений из 49, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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