Sql 向窗口函数添加条件

Sql 向窗口函数添加条件,sql,hive,Sql,Hive,我有以下形式的数据: page_name user_id date_time input_age result_age Page 1 1420356 2017-11-29 09:25:49 65 Page 1 1516923 2017-11-29 10:47:15 65 Page 1 1518546 2017-11-29 13:16:34 65 Page 1 151

我有以下形式的数据:

page_name   user_id   date_time             input_age   result_age
Page 1      1420356   2017-11-29 09:25:49   65  
Page 1      1516923   2017-11-29 10:47:15               65
Page 1      1518546   2017-11-29 13:16:34   65  
Page 1      1518546   2017-11-29 13:21:26               78
Page 1      1503723   2017-11-29 10:41:57   59  
Page 1      1503723   2017-11-29 10:46:34               59
Page 1      1761217   2017-11-29 15:59:16   65  
Page 1      1761217   2017-11-29 16:01:59   72  
Page 1      1761217   2017-11-29 16:05:59               67
Page 1      1943018   2017-11-29 11:27:14   65
Page 1      1943018   2017-11-29 11:29:52   67
Page 1      2421391   2017-11-29 09:40:41   63  
Page 1      2421391   2017-11-29 09:45:24               63
Page 1      2421391   2017-11-29 09:51:06               59
Page 1      2421391   2017-11-29 10:14:51   63          59
Page 1      2425813   2017-11-29 10:24:26               60
Page 1      2425813   2017-11-29 10:29:14               59
*请注意,数据超过1天,并且有多个页面

我要查找的是根据每个页面名称的用户id级别上的最新日期和时间找到的年龄;如果此时结果年龄不为空-无论输入年龄是否为空,都取该值。如果为空,则取输入值。 因此,在用户id/页面名称级别,无论时间如何,生成的年龄都是唯一的

我知道我们需要像按用户id分区的行数,按日期的页面名称顺序,按时间描述为行。。。其中row=1,但我不确定如何添加条件

样本输出:

page_name   user_id   date_time             input_age   result_age
Page 1      1420356   2017-11-29 09:25:49   65  
Page 1      1516923   2017-11-29 10:47:15               65
Page 1      1518546   2017-11-29 13:21:26               78
Page 1      1503723   2017-11-29 10:46:34               59
Page 1      1761217   2017-11-29 16:05:59               67
Page 1      1943018   2017-11-29 11:29:52   67
Page 1      2421391   2017-11-29 10:14:51               59
Page 1      2425813   2017-11-29 10:29:14               59
谢谢你的帮助


请注意,我的数据位于配置单元中,但我假设它与大多数SQL版本的上下文相似

如果要使用窗口函数获取每x的最新记录,通常将查询(包括窗口函数)放入子查询中,然后将条件放入外部查询中:

SELECT * FROM
(
  SELECT 
    *, 
    ROW_NUMBER() OVER(PARTITION BY whatever ORDER BY whateveresle) as rown
  FROM
    joins etc
)a
WHERE 
  rown = 1
如果您有两个日期,并且您想要其中一个,除非它为null,否则您需要另一个,请使用COALESCEresult\u age,input\u age-如果它有值,则为您提供result\u age,否则输入age。COALESCE接受任意数量的参数,从左到右工作,返回第一个非空参数

最后,我认为您所关注的问题是:

SELECT a.*, COALESCE(a.result_age, a.input_age) as some_age FROM
(
  SELECT 
    table.*, 
    ROW_NUMBER() OVER(PARTITION BY page_name, user_id ORDER BY date_time DESC) as rown
  FROM
    table
)a
WHERE 
  rown = 1

是的,请把样品输出!当然我会的!非常感谢,这正是我想要的。