Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 配置单元-创建数据集,用最常见的_Sql_Hadoop_Hive - Fatal编程技术网

Sql 配置单元-创建数据集,用最常见的

Sql 配置单元-创建数据集,用最常见的,sql,hadoop,hive,Sql,Hadoop,Hive,我需要创建一个数据集,该数据集包含与源表相同的行,但将出生日期替换为该人员最常见的出生日期值。如果出现平局,则应使用最近的日期 输入 输出 1 john doe 06/11/86 01/01/17 2 john doe 06/11/86 01/01/17 3 john doe 06/11/86 01/01/17 4 jane doh 01/01/80 01/01/17 5 jane doh 01/01/80 01/02/17 John Doe最常见于1986年11月6日更新。jane doh更

我需要创建一个数据集,该数据集包含与源表相同的行,但将出生日期替换为该人员最常见的出生日期值。如果出现平局,则应使用最近的日期

输入

输出

1 john doe 06/11/86 01/01/17
2 john doe 06/11/86 01/01/17
3 john doe 06/11/86 01/01/17
4 jane doh 01/01/80 01/01/17
5 jane doh 01/01/80 01/02/17
John Doe最常见于1986年11月6日更新。jane doh更新为01/01/80断开连接

我最近的尝试基于一个类似的例子:

SELECT a.id, a.first_name, a.last_name, a.date, b.id  FROM 
(SELECT first_name, last_name,dob,count(*) FROM table group by first_name, last_name,dob having count(*) in 
(SELECT max(total) AS freq FROM 
(SELECT first_name, last_name, dob, count(*) AS total FROM table group by first_name, last_name, dob) 
AS test_temp group by first_name, last_name)
) a   join (select * FROM table) b on (a.id = b.id)
我不仅需要一个解决方案,还需要一个可以从中学习的解释。

选择a.id、a.first\u name、a.last\u name、b.dob、a.date 从表a 加入选择不同id、名字、姓氏、dob、countdob作为cnt 根据cnt DESC LIMIT 1 b从表顺序 在a.first_name=b.first_name和a.last_name=b.last_name上

我想试试这个。为了得到最常见的dob,我用一个子选择加入了基表。通过cnt DESC LIMIT 1的订购,我让舒尔获得了最常见的dob,而不会在MaxCountDoB不是唯一的情况下遇到麻烦。然后我就把那个dob加入到每一张有着相同名字和姓氏的唱片中。我希望这能对您有所帮助。

您可以使用first_value函数指定出生日期,而无需连接:

SELECT a.id, a.first_name, a.last_name, a.date, b.id  FROM 
(SELECT first_name, last_name,dob,count(*) FROM table group by first_name, last_name,dob having count(*) in 
(SELECT max(total) AS freq FROM 
(SELECT first_name, last_name, dob, count(*) AS total FROM table group by first_name, last_name, dob) 
AS test_temp group by first_name, last_name)
) a   join (select * FROM table) b on (a.id = b.id)
  select t.id, t.first_name, t.last_name,
         first_value(dob) over (partition by first_name, last_name
                                order by dob_cnt desc, date desc
                                rows between unbounded preceding and current row
                               ) as dob_imputed
  from (select t.*,
               count(*) over (partition by first_name, last_name, dob) as dob_cnt
        from t
       ) t