我正在做SSMS 2012。
我已经创建了一个Facttable和它的维度,它们都与ParentID关系相关联。我已经创建了一些视图,以一种更加用户友好的方式显示Facttable和维度(简单地取消透视)。当我使用LEFT OUTER JOIN从这些视图中获取信息时,一切工作得无懈可击。
问题是在我的一些维度中,我与Facttable之间存在n对1的关系。例如,我在Facttable中存储了一家公司的一般信息,并在维度中存储了该公司股票的每日价值。
“问题”是,当我执行视图的左外连接时,表的左侧有很多冗余信息(对应于公司的一般信息)。
给你一个概念:
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和不同维度的多个“冗余”信息是可行的(如果同一公司每天存在不同的价格,相同的日期将只出现一次,然后将为空)。
这是我的想法,但请随时发表你对这件事的意见。核心是避免我的大的1对n的关系,使我的计算机变得困难。
发布于 2017-11-29 00:26:24
我不知道这是什么意思:
我知道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,因此行与您预期的一样。
https://stackoverflow.com/questions/47536003
复制相似问题