0

我正在研究 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 关系,让我的电脑很难。

4

1 回答 1

0

我不懂这啥意思:

我知道 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,因此行与您期望的一样。

于 2017-11-28T16:26:24.497 回答