首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改进Facttable和dimensions之间的连接

改进Facttable和dimensions之间的连接
EN

Stack Overflow用户
提问于 2017-11-29 00:07:45
回答 1查看 36关注 0票数 0

我正在做SSMS 2012。

我已经创建了一个Facttable和它的维度,它们都与ParentID关系相关联。我已经创建了一些视图,以一种更加用户友好的方式显示Facttable和维度(简单地取消透视)。当我使用LEFT OUTER JOIN从这些视图中获取信息时,一切工作得无懈可击。

问题是在我的一些维度中,我与Facttable之间存在n对1的关系。例如,我在Facttable中存储了一家公司的一般信息,并在维度中存储了该公司股票的每日价值。

“问题”是,当我执行视图的左外连接时,表的左侧有很多冗余信息(对应于公司的一般信息)。

给你一个概念:

代码语言:javascript
复制
   NAME      CITY      DATE           STOCK_PRICE
   Alpha     Tokyo     05/01/2017        2.2
   Alpha     Tokyo     04/01/2017        2.3
   Alpha     Tokyo     03/01/2017        2.1
   Alpha     Tokyo     02/01/2017        2.0
   Alpha     Tokyo     01/01/2017        2.4

我知道NULL的处理方式比“实际”值更有效。我们的想法就是实现这样的目标。

代码语言:javascript
复制
   NAME      CITY      DATE           STOCK_PRICE
   Alpha     Tokyo     05/01/2017        2.2
   NULL      NULL      04/01/2017        2.3
   NULL      NULL      03/01/2017        2.1
   NULL      NULL      02/01/2017        2.0
   NULL      NULL      01/01/2017        2.4

在最好的情况下,这个想法对于来自Facttable和不同维度的多个“冗余”信息是可行的(如果同一公司每天存在不同的价格,相同的日期将只出现一次,然后将为空)。

这是我的想法,但请随时发表你对这件事的意见。核心是避免我的大的1对n的关系,使我的计算机变得困难。

EN

回答 1

Stack Overflow用户

发布于 2017-11-29 00:26:24

我不知道这是什么意思:

我知道NULL的处理方式比“实际”值更有效。我们的想法就是实现这样的目标。

这不是我“知道”的事情。

如果您只需要最近一行上的值,那么可以使用row_number()来实现。我不推荐这样做,但是SQL看起来像这样:

代码语言:javascript
复制
with t as (
      <your query here>
     )
select (case when seqnum = 1 then name end) as name,
       (case when seqnum = 1 then city end) as city,
       date, stock_price
from (select t.*,
             row_number() over (partition by name, city order by date desc) as seqnum
      from t
     ) t
order by name, city, seqnum;

我不建议这样做的原因是SQL结果集通常是无序的。通过替换值,您可以对结果集施加顺序。我已经调整了查询,使其具有显式的order by,因此行与您预期的一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47536003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档