powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Что у вас показывает sum( X )over(order by X), когда в столбце 'X' есть NULL'ы ?
7 сообщений из 7, страница 1 из 1
Что у вас показывает sum( X )over(order by X), когда в столбце 'X' есть NULL'ы ?
    #38584366
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Дано: таблица `t2` с двумя int-полями:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE T2(ID INT, X INT);
COMMIT;
INSERT INTO T2 (ID, X) VALUES (1, 1);
INSERT INTO T2 (ID, X) VALUES (2, NULL);
INSERT INTO T2 (ID, X) VALUES (3, 0);
INSERT INTO T2 (ID, X) VALUES (4, NULL);
INSERT INTO T2 (ID, X) VALUES (5, 2);
INSERT INTO T2 (ID, X) VALUES (6, NULL);
INSERT INTO T2 (ID, X) VALUES (7, 1);
INSERT INTO T2 (ID, X) VALUES (8, NULL);
INSERT INTO T2 (ID, X) VALUES (9, 0);
INSERT INTO T2 (ID, X) VALUES (10, NULL);
COMMIT;

Запрос-1:
Код: sql
1.
select id,x,sum(x)over(order by  x  desc) from t2 order by x;


Запрос-2:
Код: sql
1.
select id,x,sum(x)over(order by  id ) from t2 order by x;



Результат запроса-1 в Oracle 11.2.g по неведомым причинам содержит NULL'ы в sum()over():
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        ID          X SUM(X)OVER(ORDERBYXDESC)
---------- ---------- ------------------------
         9          0                        4
         3          0                        4
         1          1                        4
         7          1                        4
         5          2                        2
         4 ***null*** ***null***
         6 ***null*** ***null***
         2 ***null*** ***null***
         8 ***null*** ***null***
        10 ***null*** ***null***

Результат запроса-2 этого уже не содержит:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        ID          X SUM(X)OVER(ORDERBYID)
---------- ---------- ---------------------
         9          0                     4
         3          0                     1
         1          1                     1
         7          1                     4
         5          2                     3
         6 ***null***                     3
         4 ***null***                     1
         8 ***null***                     4
         2 ***null***                     1
        10 ***null***                     4


Для сравнения, результаты запроса-1 в других СУБД:
Firebird 3.0:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> select id,x,sum(x)over(order by x desc) from t2 order by x nulls last,id;

          ID            X                   SUM
============ ============ =====================
           3            0                     4
           9            0                     4
           1            1                     4
           7            1                     4
           5            2                     2
           2       <null>                     4
           4       <null>                     4
           6       <null>                     4
           8       <null>                     4
          10       <null>                     4

MS SQL 2008:
Код: plaintext
1.
2.
3.
4.
with 
r as(select 1 id union all select r.id+1 from r where r.id<10)
,t as(select id,iif(id%2<>0,id%3,null) x from r)
select id,x,sum(x)over(order by x desc) s from t 
order by isnull(x, 999999),id
idxs3049041147145222NULL44NULL46NULL48NULL410NULL4
Что показывает запрос-1 в других СУБД, поддерживающих оконные функции ?
...
Рейтинг: 0 / 0
Что у вас показывает sum( X )over(order by X), когда в столбце 'X' есть NULL'ы ?
    #38584375
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

postgresql 9.3
Код: sql
1.
select id,x,sum(x)over(order by  x desc NULLS LAST ) from t2 order by x ;


30490471411452284104244464

Код: sql
1.
select id,x,sum(x)over(order by  x desc /*NULLS LAST*/ ) from t2 order by x ;


304904714114522108642
наверное разное дефолтное NULLS FIRST|LAST в разных субд
...
Рейтинг: 0 / 0
Что у вас показывает sum( X )over(order by X), когда в столбце 'X' есть NULL'ы ?
    #38584386
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

А почему не должен?
Код: 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 t as (
 select 1 id, 1 x from dual
  union all
 select 2 id, null x from dual
  union all
 select 3 id, 0 x from dual
  union all
 select 4 id, null x from dual
  union all
 select 5 id, 2 x from dual
)  
 select id,x,sum(x)over(order by  x desc nulls first) s
   from t t2
  order by x;

with t as (
 select 1 id, 1 x from dual
  union all
 select 2 id, null x from dual
  union all
 select 3 id, 0 x from dual
  union all
 select 4 id, null x from dual
  union all
 select 5 id, 2 x from dual
)  
 select id,x,sum(x)over(order by  x desc nulls last) s
  from t t2
  order by x;



а в документации написано:NULLS LAST is the default for ascending order, and NULLS FIRST is the default for descending order.

...
Рейтинг: 0 / 0
Что у вас показывает sum( X )over(order by X), когда в столбце 'X' есть NULL'ы ?
    #38584410
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я сравнил еще результаты без всякого упоминания nulls first / last.
Вот для sum(x)over(order by x ASCENDING):over(order by x asc)QueryIDXSFirebird 3.0with recursive2nullnullr as(select 1 id from rdb$database union all select r.id+1 from r where r.id<10)4nullnull,t as(select id,case when mod(id,2)<>0 then mod(id,3) else null end x from r)6nullnullselect id,x,sum(x)over(order by x) s from t8nullnullorder by x,id;10nullnull300900112712524MS SQL 2008with idxsr as(select 1 id union all select r.id+1 from r where r.id<10)2NULLNULL,t as(select id,iif(id%2<>0,id%3,null) x from r)4NULLNULLselect id,x,sum(x)over(order by x ) s from t 6NULLNULLorder by x,id8NULLNULL10NULLNULL300900112712524ORA 11.2 gwithIDXSr as(select level+1 id from dual connect by level<10)300,t as(select id,case when mod(id,2)<>0 then mod(id,3) else null end x from r)900select id,x,sum(x)over(order by x) s from t 711order by x,id;5232***null***34***null***36***null***38***null***310***null***3
И вот для sum(x)over(order by x DESCENDING):over(order by x desc)QueryIDXSFirebird 3.0with recursive2null4r as(select 1 id from rdb$database union all select r.id+1 from r where r.id<10)4null4,t as(select id,case when mod(id,2)<>0 then mod(id,3) else null end x from r)6null4select id,x,sum(x)over(order by x desc) s from t8null4order by x,id;10null4304904114714522MS SQL 2008with idxsr as(select 1 id union all select r.id+1 from r where r.id<10)2NULL4,t as(select id,iif(id%2<>0,id%3,null) x from r)4NULL4select id,x,sum(x)over(order by x desc) s from t 6NULL4order by x,id8NULL410NULL4304904114714522ORA 11.2 gwithIDXSr as(select level+1 id from dual connect by level<10)303,t as(select id,case when mod(id,2)<>0 then mod(id,3) else null end x from r)903select id,x,sum(x)over(order by x desc) s from t 713order by x,id;5222***null******null***4***null******null***6***null******null***8***null******null***10***null******null***
Чё-то настораживает, что в Оракле не сходится ни с чем: ни с MS, ни с PG, ни с FB...
...
Рейтинг: 0 / 0
Что у вас показывает sum( X )over(order by X), когда в столбце 'X' есть NULL'ы ?
    #38584430
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, в предыдущем посте ошибка в оракловом варианте запроса. в топку его.
Вопрос на самом деле вот какой: почему результаты в ФБ и в Оракле хотя и совпадают, выглядят "перевёрнутыми" друг отн. друга ?DBMSQueryIDXSDBMSIDXSFirebird 3.0with recursive2null4ORA 11.2 gwith300order by x asc nulls lastr as(select 1 id from rdb$database union all select r.id+1 from r where r.id<10)4null4order by x asc nulls lastr as(select level id from dual connect by level<=10)900,t as(select id,case when mod(id,2)<>0 then mod(id,3) else null end x from r)6null4,t as(select id,case when mod(id,2)<>0 then mod(id,3) else null end x from r)112select id,x,sum(x)over(order by x nulls last) s from t8null4select id,x,sum(x)over(order by x nulls last) s from t712order by x,id;10null4order by x,id;5243002***null***49004***null***41126***null***47128***null***452410***null***4Firebird 3.0with recursiveIDXSORA 11.2 gwithIDXSorder by x asc, nulls firstr as(select 1 id from rdb$database union all select r.id+1 from r where r.id<10)2nullnullorder by x asc, nulls firstr as(select level id from dual connect by level<=10)300,t as(select id,case when mod(id,2)<>0 then mod(id,3) else null end x from r)4nullnull,t as(select id,case when mod(id,2)<>0 then mod(id,3) else null end x from r)900select id,x,sum(x)over(order by x nulls first) s from t6nullnullselect id,x,sum(x)over(order by x nulls first) s from t112order by x,id;8nullnullorder by x,id;71210nullnull5243002***null******null***9004***null******null***1126***null******null***7128***null******null***52410***null******null***Firebird 3.0with recursiveIDXSORA 11.2 gwithIDXSorder by x desc, nulls lastr as(select 1 id from rdb$database union all select r.id+1 from r where r.id<10)2null4order by x desc, nulls lastr as(select level id from dual connect by level<=10)304,t as(select id,case when mod(id,2)<>0 then mod(id,3) else null end x from r)4null4,t as(select id,case when mod(id,2)<>0 then mod(id,3) else null end x from r)904select id,x,sum(x)over(order by x desc nulls last) s from t6null4select id,x,sum(x)over(order by x desc nulls last) s from t114order by x,id;8null4order by x,id;71410null45223042***null***49044***null***41146***null***47148***null***452210***null***4Firebird 3.0with recursiveIDXSORA 11.2 gwithIDXSorder by x desc, nulls firstr as(select 1 id from rdb$database union all select r.id+1 from r where r.id<10)2nullnullorder by x desc, nulls firstr as(select level id from dual connect by level<=10)304,t as(select id,case when mod(id,2)<>0 then mod(id,3) else null end x from r)4nullnull,t as(select id,case when mod(id,2)<>0 then mod(id,3) else null end x from r)904select id,x,sum(x)over(order by x desc nulls first) s from t6nullnullselect id,x,sum(x)over(order by x desc nulls first) s from t114order by x,id;8nullnullorder by x,id;71410nullnull5223042***null******null***9044***null******null***1146***null******null***7148***null******null***52210***null******null***
...
Рейтинг: 0 / 0
Что у вас показывает sum( X )over(order by X), когда в столбце 'X' есть NULL'ы ?
    #38584441
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

ты читаешь, что тебе выше пишут? Сергей Арсеньев вроде ответил уже.
...
Рейтинг: 0 / 0
Что у вас показывает sum( X )over(order by X), когда в столбце 'X' есть NULL'ы ?
    #38584443
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrты читаешь, что тебе выше пишут? Сергей Арсеньев вроде ответил уже.не увидел ответы, сидел "внутри себя" :-)
Вроде всё ясно, вопрос закрыт.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Что у вас показывает sum( X )over(order by X), когда в столбце 'X' есть NULL'ы ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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