在 s-s-rS 的行组中获取下一个值

Posted

技术标签:

【中文标题】在 s-s-rS 的行组中获取下一个值【英文标题】:Get Next Value within Row Groups in s-s-rS 【发布时间】:2017-07-28 00:22:43 【问题描述】:

我正在尝试通过获取 NextRow 值来解决一个问题,但仅限于特定的 RowGroup。

这是我想要做的:

if Fields!Interventions.Value is not blank and nextrow(Fields!DateOccurred.Value) within the group is within 4 hours then Y else N

还有另一栏:

if Fields!Interventions.Value is not blank compare currentrow(Fields!DateOccurred.Value) to nextrow(Fields!DateOccurred.Value) and display the differences in hours

但我不知道如何在 s-s-rS 中执行此表达式。

我看到了以下问题: Get previous,current and Next Record in s-s-rs report in a page 但这个问题是它不适用于 s-s-rS 中的行组。

根据进一步的建议,这似乎在 s-s-rS 中是不可能的,但在查询本身中是可能的。

这是我正在处理的查询:

SELECT 
    ROW_NUMBER() OVER(PARTITION BY R.PatientID, PL.ChartLocationID ORDER BY P.DateOccurred ASC) As Row#,
    R.NameFirst,
    R.NameLast,
    P.DateOccurred,
    CASE P.Interventions
    WHEN 1 Then 'Regular Analgesia'
    When 2 Then 'Heat Pack'
    When 4 Then 'Cold Pack'
    When 8 Then 'Massage'
    When 16 Then 'Exercise'
    When 32 Then 'Other'
    END as Interventions
FROM 
    ChartEntry P
LEFT JOIN ChartLocation PL on
    P.ChartLocationId = PL.ChartLocationId  
Inner Join Resident R on
    PL.ResidentID = R.PatientID 
where 
    P.DateDeleted is null and
    P.DateOccurred >= '01 Jul 2017' and
    P.DateOccurred < '01 Aug 2017'  

有可能实现吗?

以下是一些示例数据,显示了额外两列的结果:

【问题讨论】:

【参考方案1】:

最简单和更好的方法是在您的SQL 中使用LAG/LEAD 来解决这个问题。

【讨论】:

感谢您的评论,但使用的是 SQL Server 2008 R2。 然后用self-join或者CTE来确定你想要什么?这取决于您的 SQL 技能。或者您可以随时发布示例数据,会员可以提出解决方案。我认为这在 s-s-rS 中是不可行的。【参考方案2】:

您可以在 s-s-rS 中执行此操作:

将您的详细信息值设置为Previous(Fields!DateOccurred.Value),并将详细信息行可见性设置为= RowNumber("yourgroup") = 1,这将隐藏第一行。

在组总计​​中使用一行,以便通过将其值设置为 =Last(Fields!DateOccurred.Value) 来显示最后一个值

详细信息的日期差异表达式检查将是

=Iif(
NOT(Fields!Interventions.Value Is Nothing) AND
DateDiff("h", Previous(Fields!DateOccurred.Value),Fields!DateOccurred.Value)>=4,
"Y",
"N"
)

最后一行

=Iif(
NOT(Fields!Interventions.Value Is Nothing) AND
DateDiff("h", Last(Fields!DateOccurred.Value),Now())>=4,
"Y",
"N"
)

在下面的图片中,红线将在可见性条件下隐藏。 您的报告将仅包含预期日期列,我包含当前行日期以进行演示。

【讨论】:

感谢您的回复。就 yourgroup 而言, = RowNumber("yourgroup") = 1 是什么意思?如果有帮助,我在 Viking 发表评论后更新了最初的问题。 将“yourgroup”替换为您在 tablix 中的组名。如果没有组但只有详细信息,“yourgroup”值应与 tablix 名称相同。 @James 我也更新了我的答案以匹配新的字段名称 对不起,我完全迷失了你的解决方案。它应该查看 Next DateOccurred 而不是 Previous DateOccurred。您的解决方案看起来像使用上一个,而不是下一个,除非我遗漏了什么? 我知道解决方法有点混乱。假设我们有 10 行,如我的示例所示。我们在第 2 行显示第 1 行数据,在第 3 行显示第 2 行数据,...最后在总行上显示第 10 行数据。所以 row2 上一个日期实际上是 row1 日期,而 row2 日期实际上是 row1 下一个日期。现在清楚了吗?

以上是关于在 s-s-rS 的行组中获取下一个值的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS:在导出到 Excel 时抑制 Tablix 上的隐藏行组

如何在pandas中将多个相同类别的行组合成一个?

s-s-rS 2008 - 如何使用用户定义的分组隐藏行组列?

Oracle SQL - 过滤掉包含具有特定值的行的分区或行组

s-s-rS 跨行组和列组计算计数

查找具有已定义结束的连续相同值的行组 (SQL Redshift)