powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / не получается уникально, distinct, partition by
15 сообщений из 15, страница 1 из 1
не получается уникально, distinct, partition by
    #40114926
ssCandal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Из таблицы tmp_br2336_device для каждого msisdn нужно найти крайние (по дате) os_type и terminal_type. Написал следующий запрос. Но некоторым msisdn сопоставляются по несколько пар os_type и terminal_type.
Код: plsql
1.
2.
3.
4.
5.
6.
create table tmp_br2336_smartphone
as
select distinct dv.msisdn,
    first_value(dv.os_type) over (partition by dv.msisdn order by dv.msisdn_last_updt DESC) os_type,
    first_value(dv.terminal_type) over (partition by dv.msisdn order by dv.msisdn_last_updt DESC) terminal_type  
from tmp_br2336_device dv



Подскажите, пожалуйста, что делаю неправильно?

Заранее благодарен!
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114929
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
create table tmp_br2336_smartphone
as
select dv.msisdn
     , max(dv.os_type) keep(dense_rank last order by dv.msisdn_last_updt) os_type
     , max(dv.terminal_type) keep(dense_rank last order by dv.msisdn_last_updt) terminal_type  
from tmp_br2336_device dv
group by dv.msisdn
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114930
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ssCandal,
Попробуйте так.
Код: sql
1.
2.
3.
4.
5.
select distinct msisdn, os_type, terminal_type FROM (
select dv.msisdn,
    first_value(dv.os_type) over (partition by dv.msisdn order by dv.msisdn_last_updt DESC) os_type,
    first_value(dv.terminal_type) over (partition by dv.msisdn order by dv.msisdn_last_updt DESC) terminal_type  
from tmp_br2336_device dv)
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114932
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create table tmp_br2336_smartphone
  as
    select  dv.msisdn,
            max(dv.os_type) keep(dense_rank last order by dv.msisdn_last_updt,dv.rowid) os_type,
            max(dv.terminal_type) keep(dense_rank last order by dv.msisdn_last_updt,dv.rowid) terminal_type  
      from  tmp_br2336_device dv
      group by partition by dv.msisdn
/



SY.
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114933
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
Попробуйте так.

Просто интересно - на какой эффект Вы рассчитываете, предлагая данное "так"?
SY
Код: plsql
1.
group by partition by dv.msisdn


По ходу я опять чего-то не знаю...
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114935
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

order by dv.msisdn_last_updt - не детерминирован (разве только поле msisdn_last_updt уникально).

SY.
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114936
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous

Просто интересно - на какой эффект Вы рассчитываете, предлагая данное "так"?
SY
Код: plsql
1.
group by partition by dv.msisdn


По ходу я опять чего-то не знаю...


Упс - cut & paste. Конечно partition by лишний:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create table tmp_br2336_smartphone
  as
    select  dv.msisdn,
            max(dv.os_type) keep(dense_rank last order by dv.msisdn_last_updt,dv.rowid) os_type,
            max(dv.terminal_type) keep(dense_rank last order by dv.msisdn_last_updt,dv.rowid) terminal_type  
      from  tmp_br2336_device dv
      group by dv.msisdn
/



SY.
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114939
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
andrey_anonymous,
order by dv.msisdn_last_updt - не детерминирован (разве только поле msisdn_last_updt уникально).

Полагаю, в рамках задачи в пределах группы его можно принять уникальным.
Но доп. сортировка по rowid, конечно, делает решение более общим.
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114978
ssCandal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работает не так, как нужно мне
SergiiW
ssCandal,
Попробуйте так.
Код: sql
1.
2.
3.
4.
5.
select distinct msisdn, os_type, terminal_type FROM (
select dv.msisdn,
    first_value(dv.os_type) over (partition by dv.msisdn order by dv.msisdn_last_updt DESC) os_type,
    first_value(dv.terminal_type) over (partition by dv.msisdn order by dv.msisdn_last_updt DESC) terminal_type  
from tmp_br2336_device dv)



Запрос
Код: plsql
1.
select count(*), count(distinct msisdn) from tmp_br2189_smartphone


выдал
Код: plsql
1.
2.
3.
COUNT(*)	COUNT(DISTINCTMSISDN)
--------	---------------------
31314   	22337                


А хотелось бы получить
Код: plsql
1.
2.
3.
COUNT(*)	COUNT(DISTINCTMSISDN)
--------	---------------------
22337   	22337                
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114984
ssCandal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msisdn_last_updt уникальны для каждого конкретного msisdn. По крайне мере, я так думаю...
andrey_anonymous
SY
andrey_anonymous,
order by dv.msisdn_last_updt - не детерминирован (разве только поле msisdn_last_updt уникально).

Полагаю, в рамках задачи в пределах группы его можно принять уникальным.
Но доп. сортировка по rowid, конечно, делает решение более общим.
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114987
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssCandal
Работает не так, как нужно мне

Вам уже два человека показали как сделать правильно.
Но в работу Вы взяли изначально неверный вариант.
Продолжайте в том же духе.
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114989
ssCandal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Другие предложенные варианты я тоже испробовал. Просто ищу вариант без group by.
andrey_anonymous
ssCandal
Работает не так, как нужно мне

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


А так, оказалось, что пара (dv.msisdn, dv.msisdn_last_updt) не уникальна, хотя я рассчитывал на это.
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114992
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
ssCandal,
Попробуйте так.


Если хочешь аналитику:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with t as (
           select  msisdn,
                   os_type,
                   terminal_type,
                   row_number() over (partition by msisdn order by msisdn_last_updt desc) rn
             from  tmp_br2336_device
          )
select  msisdn,
        os_type,
        terminal_type
  from  t
  where rn = 1
/



или

Код: plsql
1.
2.
3.
4.
5.
6.
7.
select  msisdn,
        os_type,
        terminal_type
  from  tmp_br2336_device
  order by row_number() over (partition by msisdn order by msisdn_last_updt desc)
  fetch first 1 row with ties
/



Кстати, аналитика дает преимущество так как позволяет вывести любое количество строк с любым рангом (например первые по имени 3 сотрудника из каждого отдела с 5-ой по величине зарплатой.

SY.
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114994
ssCandal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,
Спасибо!
...
Рейтинг: 0 / 0
не получается уникально, distinct, partition by
    #40114996
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssCandal
Другие предложенные варианты я тоже испробовал. Просто ищу вариант без group by.
...
А так, оказалось, что пара (dv.msisdn, dv.msisdn_last_updt) не уникальна, хотя я рассчитывал на это.


Вариант без group by - зачем, если под задачу лучше подходит именно он?

По уникальности - тогда вариация от SY, добавьте в order by вторым компонентом rowid, это предотвратит возможный косяк, когда ostype возьмется от одной записи, а тип терминала - от другой.


SY
Если хочешь аналитику:
Код: plsql
1.
                   row_number() over (partition by dv.msisdn order by dv.msisdn_last_updt desc) rn



В означенных условиях мне больше по душе вариация от Elic
Код: plsql
1.
lag(null,1,'1')over (partition by dv.msisdn order by dv.msisdn_last_updt desc) f


которая метит крайнюю в порядке сортировки запись, а не нумерует всю выборку.
...только лучше
Код: plsql
1.
lead(null,1,'1')over (partition by dv.msisdn order by dv.msisdn_last_updt) f


а то наступал не так давно на баг, связанный с desc-сортировкой
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / не получается уникально, distinct, partition by
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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