У меня есть запрос 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'