|
Как достать первые неск.зап.для каждой уникал.комбинации ключей
|
|||
---|---|---|---|
#18+
Привет всем Есть таблица T(A,B,C) с набором данных 1, 1 ,xxx 1, 1, eee 1, 1, ddd 2, 1, fff 3, 4, ddd 3, 4, dfdd 3, 4, fff 3, 5, kkk ......... Мне необходимо вытащить только первые две записи для каждой уникальной комбинации A+B Условие : Это должен быть один запрос. Может кто даст идею ? Заранее благодарен. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2003, 11:50 |
|
Как достать первые неск.зап.для каждой уникал.комбинации ключей
|
|||
---|---|---|---|
#18+
SELECT DISTINCT T.A, T.B FROM T ORDER BY T.A, T.B FETCH FIRST 2 ROWS ONLY ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2003, 11:59 |
|
Как достать первые неск.зап.для каждой уникал.комбинации ключей
|
|||
---|---|---|---|
#18+
видно я замароченно написал из списка представленных записей мне надо получить 1, 1 ,xxx (первое появление 1 +1 ) 1, 1, eee (второе появление 1 + 1) (исключаем все отсальные 1 + 1) 2, 1, fff 3, 4, ddd 3, 4, dfdd 3, 5, kkk ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2003, 12:06 |
|
Как достать первые неск.зап.для каждой уникал.комбинации ключей
|
|||
---|---|---|---|
#18+
Теперь проблема в сортировке строк. Придется завести еще одно поле для указания порядка (Q). WITH Q1(Q, A, B, C) AS (VALUES(1, 1, 1 ,'xxx'), (2, 1, 1, 'eee'), (3, 1, 1, 'ddd'), (4, 2, 1, 'fff'), (5, 3, 4, 'ddd'), (6, 3, 4, 'dfdd'), (7, 3, 4, 'fff'), (8, 3, 5, 'kkk')), Q2(Q, A, B, C) AS (SELECT Q1.Q, Q1.A, Q1.B, COUNT(Q2.Q) FROM Q1 INNER JOIN Q1 Q2 ON (Q1.Q >= Q2.Q AND Q1.A = Q2.A AND Q1.B = Q2.B) GROUP BY Q1.Q, Q1.A, Q1.B HAVING COUNT(Q2.Q) <= 2) SELECT Q1.* FROM Q1 INNER JOIN Q2 ON (Q2.Q = Q1.Q) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2003, 12:46 |
|
Как достать первые неск.зап.для каждой уникал.комбинации ключей
|
|||
---|---|---|---|
#18+
С небольшой заменой на реальную таблицу, запрос работает ! WITH Q1(Q, A, B, C) AS (SELECT row_number() over(), COL1, COL2, COL3 FROM REAL_TABLE), Q2(Q, A, B, C) AS (SELECT Q1.Q, Q1.A, Q1.B, COUNT(Q2.Q) FROM Q1 INNER JOIN Q1 Q2 ON (Q1.Q >= Q2.Q AND Q1.A = Q2.A AND Q1.B = Q2.B) GROUP BY Q1.Q, Q1.A, Q1.B HAVING COUNT(Q2.Q) <= 2) SELECT Q1.* FROM Q1 INNER JOIN Q2 ON (Q2.Q = Q1.Q) Огромное спасибо 2 Alexey Popov осталось только решить вопрос как его отработать на таблице с 10млн записей :), но ето уже детали ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2003, 16:00 |
|
Как достать первые неск.зап.для каждой уникал.комбинации ключей
|
|||
---|---|---|---|
#18+
select a,b,c from (select row_number() over (partition by a,b order by c) as num, a,b,c from t) ss where num = 1 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2003, 06:58 |
|
Как достать первые неск.зап.для каждой уникал.комбинации ключей
|
|||
---|---|---|---|
#18+
пардон - последняя строка должна быть: num <= 2 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2003, 07:01 |
|
|
start [/forum/topic.php?fid=43&msg=32299573&tid=1606456]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 328ms |
total: | 477ms |
0 / 0 |