【问题标题】:Improve the JOINs between Facttable and dimensions改进 Facttable 和维度之间的 JOIN
【发布时间】:2018-05-12 04:07:03
【问题描述】:

我正在研究 SSMS 2012。

我创建了一个 Facttable 及其维度,两者都与 ParentID 关系。我创建了以更用户友好的方式显示 Facttable 和维度的视图(简单地取消透视)。当我使用 LEFT OUTER JOIN 从这些视图中获取信息时,一切都完美无缺。

事情是在我的某些维度上,我与我的 Facttable 有 n 对 1 的关系。例如,我在我的 Facttable 中存储了有关一家公司的一般信息,并在维度中存储了其股票的每日价值。

“问题”是当我对视图进行 LEFT OUTER JOIN 时,我在表的左侧部分有很多冗余信息(对应于公司的一般信息)。

给你一个想法:

   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 的处理方式比“实际”值更有效。 我们的想法是实现类似的目标。

   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 和不同维度的多个“冗余”信息是可行的(如果同一家公司每天存在不同的价格,相同的日期只会出现一次,然后将为 NULL)

这是我的想法,但请随时就此事发表您的意见。核心是真的要避免我的大的 1 对 n 关系,让我的电脑很难。

【问题讨论】:

  • 真的,您似乎要问的是“我怎样才能从我的公司表中只获取最新的行” - 这个问题已经被问过很多次了(大约 73,000 似乎).. 谷歌对于site:stackoverflow.com most recent row
  • 编辑您的问题并显示您正在使用的查询以及您想要的结果。
  • 有点难以理解您的实际要求。您似乎担心字符串会一遍又一遍地重复,这可能会导致计算机上的可用内存出现问题。但无论如何,您不会选择所有拥有所有数据的公司。所以我们不是在谈论数十亿行,而是可能有数百或数千行。这当然没有问题。所以我会说消除你的担忧:-)
  • 请举一个更具体的例子。听起来您对事实表或维度表中的任何一个(或两者)的设计都有问题。由于无法看到所涉及的结构,我们无法判断。您还可以从阅读有关最小完整可验证示例中受益。 stackoverflow.com/help/mcve
  • 这个,For example, I've stored general information about a company in my Facttable and the daily value of its stock in the dimension,听起来倒退了。

标签: sql sql-server left-join dimensions fact-table


【解决方案1】:

我不知道这是什么意思:

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

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

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

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,因此行与您预期的一样。

【讨论】:

    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多