【问题标题】:How to generate daily score in join based on most recent date on reference table如何根据参考表上的最近日期生成连接中的每日分数
【发布时间】:2019-10-09 15:29:49
【问题描述】:

SQL Vertica 问题(但感谢任何 SQL 查询答案) 我目前在“day-url”级别有一个表“Base”,我尝试通过加入“day-url”级别参考表“Score Update”来获取每天每个 url 的“分数”。问题是参考表不是每天而是特定日期级别。我需要在“基础”中的“日期”之前将“分数更新”中的分数与“更新日期”结合起来。下面的例子:(请看底部的图片)

我有什么:(基础)

Date          URL   Score                      
2019-08-01    A                        
2019-08-01    B                                      
2019-08-02    A                                 
2019-08-03    A                                  
2019-08-09    B         
2019-08-10    A         
2019-08-11    A          
2019-08-11    B      
2019-08-13    B

(分数更新)

Update_Date      URL    Score
 2019-07-25      A       x
 2019-07-25      B       y
 2019-08-10      A      alpha
 2019-08-10      B      beta

我想要的是: 我有什么:(基础)

Date            URL   Score             
2019-08-01      A      x                    
2019-08-01      B      y                      
2019-08-02      A      x                           
2019-08-03      A      x                             
2019-08-09      B      y   
2019-08-10      A      alpha   
2019-08-11      A      alpha    
2019-0B-11      B      beta 
2019-08-13      B      beta

enter image description here

并且两个表都将不断更新以获取未来的日期数据。谁能帮我如何加入这两张桌子?

谢谢!

【问题讨论】:

  • 我会离开外部联接on base.url = score.url and base.date>= score.date。我会将其用作子查询并按 base.url/base.date 对结果进行分组,然后选择 base.url、base.date、max(score.date)。这将提供 base.url/base.date 与最新 score.url/score.date 的配对。从那里,你加入 base.url/base.date 并在 score.url/score.date 上得分,最终得到你想要的 score.score。不过,似乎有一个聪明的窗口函数可以做到这一点。
  • use text, not images/links, for text--including tables & ERDs. 转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。无法搜索或剪切和粘贴图像。在图像中包含图例/键和说明。让您的帖子自成一体。
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。)对于包含 DBMS/产品和 DDL 的 SQL,其中包括约束和索引以及表格格式的初始化。展示你能做的任何相关部分。
  • 这个不清楚。使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。描述结果:说足够多的人可以离开并带着解决方案回来。在给出业务关系(船舶)/关联或表(基础或查询结果)时,说明其中的一行根据其列值说明了业务情况。

标签: sql date join vertica


【解决方案1】:

你是这个意思吗?

WITH
-- your input ...
base(dt,url,score) AS (
          SELECT DATE '2019-08-01','A',NULL
UNION ALL SELECT DATE '2019-08-01','B',NULL
UNION ALL SELECT DATE '2019-08-02','A',NULL
UNION ALL SELECT DATE '2019-08-03','A',NULL
UNION ALL SELECT DATE '2019-08-04','B',NULL
UNION ALL SELECT DATE '2019-08-05','A',NULL
UNION ALL SELECT DATE '2019-08-06','A',NULL
UNION ALL SELECT DATE '2019-08-10','A',NULL
UNION ALL SELECT DATE '2019-08-11','A',NULL
UNION ALL SELECT DATE '2019-08-11','B',NULL
UNION ALL SELECT DATE '2019-08-12','A',NULL
UNION ALL SELECT DATE '2019-08-13','A',NULL
)
,
-- your input ...
score_upd(upd_dt,url,score) AS (
          SELECT DATE '2019-07-25','A','x'
UNION ALL SELECT DATE '2019-07-25','B','alpha'
UNION ALL SELECT DATE '2019-08-10','A','y'
UNION ALL SELECT DATE '2019-08-10','B','beta'
)
-- real select starts here ..                                     
SELECT
  b.dt
, b.url
, u.score
FROM base b
LEFT JOIN score_upd u
  ON b.url=u.url
 AND b.dt INTERPOLATE PREVIOUS VALUE u.upd_dt
ORDER BY dt,url
;
-- out      dt     | url | score 
-- out ------------+-----+-------
-- out  2019-08-01 | A   | x
-- out  2019-08-01 | B   | alpha
-- out  2019-08-02 | A   | x
-- out  2019-08-03 | A   | x
-- out  2019-08-04 | B   | alpha
-- out  2019-08-05 | A   | x
-- out  2019-08-06 | A   | x
-- out  2019-08-10 | A   | y
-- out  2019-08-11 | A   | y
-- out  2019-08-11 | B   | beta
-- out  2019-08-12 | A   | y
-- out  2019-08-13 | A   | y
-- out (12 rows)

【讨论】:

  • 只有 Vertica 在外连接上有 INTERPOLATE PREVIOUS VALUE 谓词。它就是为此而建的。
  • 当然,花了一些时间来查看答案的“检查”。我还有一个问题,如果在 Base 表中,我只有从 '7-25-2019' 到 Current_date 的连续日期,我需要根据相同的逻辑加入它们(意味着我想获得一个基于每日 url 得分表在最近的上一个日期与分数)详情见这里:stackoverflow.com/questions/58379960/…
猜你喜欢
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多