Группировка наборов в Hive не дает таких же результатов, как SQL Server - PullRequest
1 голос
/ 05 октября 2019

У меня есть запрос SQL Server, который я пытаюсь преобразовать в Hive, но я не получаю ожидаемых результатов с помощью группирования наборов. Общая цель - получить всю информацию, необходимую для подведения итогов для каждого значения, для каждого поля, чтобы сгенерировать данные, необходимые для создания отчета за один проход. по какой-то причине HIVE возвращает Y для field2 независимо от того, где, поскольку SQL Server возвращает Y только один раз.

В SQL Server запрос выглядит следующим образом:

select 
    f.field1, f.field2, f.field3, count(*) count 
from 
    (select
         case 
            when field1 > '' then 'Selected'
            else '' 
         end field1,
         field2, field3,
         row_number() over (partition by ds.field4, ds.field5, ds.field6 order by ds.keyfield asc) recid1
     from 
         #data
     where 
         field3 in ('12345', '67890')
         and field2 = 'Y'
         and field1 > '') f 
where 
    recid1 = 1
group by 
    grouping sets ((),f.field1, f.field2, f.field3)

Возвращаетэти результаты:

field1  |field2|field3|count
NULL    |NULL  |12345 |10
NULL    |NULL  |67890 |2
NULL    |NULL  |NULL  |12
NULL    |Y     |NULL  |12
Selected|NULL  |NULL  |12

Когда я пытаюсь выполнить аналогичный запрос в HIVE, я получаю разные результаты:

select f.field1, f.field2, f.field3,count(*) count 
from ( 
    select 
        case 
            when field1 > '' then 'Selected' 
            else '' 
        end field1,
        field2,
        field3,
        row_number() over (partition by ds.field4, ds.field5, ds.field6 order by ds.keyfield asc) recid1 
    from mydb.mytable ds 
where
    field3 in ('12345','67890')
    and ds.field2 = 'Y'
    and ds.field1 > '' 
)f where recid1=1
group by f.field1, f.field2, f.field3 
grouping sets ((),f.field1, f.field2, f.field3) 

результаты:

+-----------+-----------+-----------+--------+
| f.field1  | f.field2  | f.field3  | count  |
+-----------+-----------+-----------+--------+
| NULL      | Y         | 12345     | 10     |
| Selected  | Y         | NULL      | 12     |
| NULL      | Y         | NULL      | 12     |
| NULL      | Y         | 67890     | 2      |
| NULL      | Y         | NULL      | 12     |
+-----------+-----------+-----------+--------+

Пример данных:

create table #data (field1 varchar(10),field2 varchar(10),field3 varchar(10),field4 varchar(10),field5 varchar(10),field6 varchar(10),keyfield varchar(10))
insert into #data select '1','Y','12345','1','1','1','1'
insert into #data select '2','Y','67890','2','2','2','2'
insert into #data select '3','Y','67890','3','3','3','3'
insert into #data select '4','Y','12345','4','4','4','4'
insert into #data select '5','Y','12345','5','5','5','5'
insert into #data select '6','Y','12345','6','6','6','6'
insert into #data select '7','Y','12345','7','7','7','7'
insert into #data select '8','Y','12345','8','8','8','8'
insert into #data select '9','Y','12345','9','9','9','9'
insert into #data select '10','Y','12345','10','10','10','10'
insert into #data select '11','Y','12345','11','11','11','11'
insert into #data select '12','Y','12345','12','12','12','12'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...