AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 14266
Accepted
db2
db2
Asked: 2012-03-03 05:36:37 +0800 CST2012-03-03 05:36:37 +0800 CST 2012-03-03 05:36:37 +0800 CST

ParallelPeriod 在日期维度中为 2 月 29 日返回 null

  • 772

我有一个由物理日期表支持的日历日期维度(最初是在 SQL Server 2000 上创建的,因此是日期时间而不是日期):

CREATE TABLE [dbo].[PostDate_Dimension](
    [post_date] [datetime] NOT NULL PRIMARY KEY,
    [day_of_year] [int] NOT NULL,
    [day_of_month] [int] NOT NULL,
    [month_of_year] [int] NOT NULL,
    [post_year]  AS (datepart(year,[post_date])),
    [post_month]  AS (datepart(month,[post_date])),
    [post_day]  AS (datepart(day,[post_date]))
)

Post Date 维度有四个属性(列出了成员键列,其中一些在 DSV 中计算):

  1. 日期(维度键)- post_date
  2. 月 - post_year, post_month
  3. 季度 - post_year,post_quarter =DatePart(quarter, "post_date"))
  4. 年份 - post_year

显然,这没什么太花哨的。我还有一些计算度量,它们使用 ParallelPeriod 来计算上一年的 YTD 数据,以便快速并排比较,而无需用户选择特定的日期片段。只需选择当前年份,它就会找到其中包含销售额的最新日期,然后与上一年的相同范围进行比较。

在上一年找到合适的日期通常归结为:

ParallelPeriod(
    [Post Date].[Post Date].[Year],
    1,
    Tail(
        NonEmpty(
            Descendants(
                [Post Date].CurrentMember,
                ,
                Leaves
            ),
            Measures.[Total Price]
        ),
        1
    ).Item(0)
)

Tail 调用是它在当前选定的 Post Date 成员(通常是当前年份)下查找最新日期的地方。这很好用。但是,如果返回 2 月 29 日,这意味着特定维度成员组合的最后一次销售发生在 2 月 29 日,那么它将 2 月 29 日传递给 ParallelPeriod 函数,该函数随后返回 null。然后上一年的 YTD 度量也返回 null。

所以,简而言之:基于这个特定的模式,有没有一种简单的方法可以让 ParallelPeriod 在 2 月 29 日的输入中表现良好?如果它只是返回上一年的 2 月 28 日,那很好。

编辑:

我尝试过的几件事:

  • 使用这个表达式来调整 Post Date 成员:
    Iif(MONTH([Post Date].[Post Date].CurrentMember.Member_Caption) = 2 And DAY([Post Date].[Post Date].CurrentMember.Member_Caption) = 29, [Post Date].[Post Date].CurrentMember.PREVMEMBER, [Post Date].[Post Date].CurrentMember)
    这行得通,但代码会很糟糕,因为我必须[Post Date].[Post Date].CurrentMember用Tail(NonEmpty(Descendants([Post Date].CurrentMember,, Leaves), Measures.[Total Price]), 1).Item(0)).
  • 使用 except 从结果中删除所有 2 月 29 日的日期NonEmpty(Descendants([Post Date].CurrentMember,, Leaves), Measures.[Total Price])。我无法找出正确的语法(如果有的话)来从维度中获取所有 2 月 29 日的集合。
  • 使用用户定义的函数创建一个 .NET 程序集,该函数将成员作为参数,如果是 2 月 29 日则返回前一个成员。似乎 Microsoft.AnalysisServices.AdomdServer 中的类非常有限,甚至没有允许这个基本任务(甚至不检索成员键作为日期值)。
ssas
  • 2 2 个回答
  • 2412 Views

2 个回答

  • Voted
  1. db2
    2012-03-03T08:41:19+08:002012-03-03T08:41:19+08:00

    好吧,我想我有一个可以忍受的解决方法。首先,我在多维数据集中创建了一个命名集,名为 Feb29:

    Filter(
        [Post Date].[Post Date].[Day].ALLMEMBERS,
        MONTH([Post Date].CurrentMember.Member_Caption) = 2 And DAY([Post Date].CurrentMember.Member_Caption) = 29
    )
    

    然后我修改了查找最新销售日期的计算部分(注意- Feb29):

    ParallelPeriod(
        [Post Date].[Post Date].[Year],
        1,
        Tail(
            NonEmpty(
                Descendants(
                    [Post Date].CurrentMember,
                    ,
                    Leaves
                ),
                Measures.[Total Price]
            ) - Feb29,
            1
        ).Item(0)
    )
    

    因此,当它查找 2012 年的最新销售日期时,它将忽略 2 月 29 日,而是与上一年 1 月 1 日至 2 月 28 日的销售情况进行比较。如果有更好的方法可以做到这一点(特别是我使用的那个糟糕的过滤器表达式),我仍然愿意接受建议。

    • 2
  2. Best Answer
    Edmund
    2015-08-18T18:40:32+08:002015-08-18T18:40:32+08:00

    另一种选择是使用联合来获取当前成员和前一个成员的并行时间段。然后从中提取第一项,它将始终是当前成员(除了 2 月 29 日的情况,它应该回退到前一个成员)。

    也就是说,与前一个成员并行周期有效合并,如下所示:

    union 
    (
        PARALLELPERIOD(
            [Date].[Fiscal Detail].[Fiscal Year],1,
            [Date].[Fiscal Detail].currentmember) 
        *(will be null if Feb 29)*
        ,
        PARALLELPERIOD(
            [Date].[Fiscal Detail].[Fiscal Year],1,
            [Date].[Fiscal Detail].currentmember.lag(1))  
        *(will be the prior year Feb 28 when above is Feb 29 )*    
    ).item(0)  *(get the first member out of the union set)*
    
    • 2

相关问题

  • 在 Microsoft BI 中查找改进材料

  • SSAS:移动 tempdb 数据库

  • OLAP 多维数据集中的布尔字段

  • SQL Server 2008 分析服务 DSO 属性

  • SSAS 维度层次结构导致部署错误

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve