【问题标题】:Flagging rows where a value changed from previous row标记值从前一行更改的行
【发布时间】:2015-08-20 17:55:09
【问题描述】:

我有一个跟踪生产的查询。每当生产一个单元时,我都会捕获时间戳、零件编号、增量时间、周期时间应该是多少,以及其他不重要的内容。在 SSRS 报告中,我计算行数并按小时对它们进行分组,并根据周期时间除以增量每小时运行效率计算。我需要在我的选择语句中添加一个列,该列将在部件号更改时进行标记,以便我可以通过在报告中引用它来识别何时发生转换。

示例:选择行的零件号-上一行的零件号作为转换

除非发生转换,否则每一行的值始终为 0,那么该行的值将是不同的。我可以让我的报告在任何值 0 上做它的事情。

【问题讨论】:

  • 如果您使用的是 SQL Server 2012,则可以使用 LAG() 函数,但对于旧版本的 SQL Server,有更长的解决方法。当我说有很多这样的问题可以回答时,请相信我(我必须看看!)。
  • 你能出示你现有的报告吗?
  • 不幸的是,我距离发布图片还有 2 个声望点。这是一个按小时计数的报告,根据效率百分比变为红色、黄色或绿色。每当我在一小时内计算 2 个不同的零件编号时,我都会添加一个蓝色,但是当一个单元在一小时内建成并且第一个单元在转换后在一小时内建成时,我会错过转换。我需要在我的 select 语句中标记更改,以便我可以在报告中引用该标记,以将小时标记为蓝色。

标签: sql reporting-services


【解决方案1】:

如 SQLHound 所述,如果您使用的是 SQL Server 2012 或其他支持 LAG 功能的数据库,那么您可以在 SQL 查询中使用它。

一个 SQL Server 示例:

SELECT
  partnumber,
  somevalue,
  CASE
    WHEN LAG(partnumber, 1) OVER (ORDER BY partnumber) <> partnumber THEN 1
    ELSE 0
  END AS PartNumberChangeOver
FROM ntest;

see it on SQL Fiddle

如果您的源数据库不支持 LAG,那么您能否告诉我们它是什么数据库/版本,以便我们尝试提供替代解决方案。

更新:使用 CTE 的其他示例,适用于 2012 年之前的 SQL Server 版本:

WITH ntestCTE
AS (SELECT
  rownum = ROW_NUMBER() OVER (ORDER BY ntest.partnumber),
  ntest.partnumber,
  ntest.somevalue
FROM ntest)
SELECT
  ntestCTE.partnumber,
  ntestCTE.somevalue,
  CASE
    WHEN ntestCTE.partnumber <> prev.partnumber THEN 1
    ELSE 0
  END AS PartNumberChangeOver
FROM ntestCTE
LEFT JOIN ntestCTE prev
  ON prev.rownum = ntestCTE.rownum - 1

See it on SQL Fiddle

【讨论】:

  • 我们使用的是 SQL Server 2008 R2 版本 6.1.7601。
  • 那么最好的办法是使用 CTE 将表连接回自身,这是另一个示例:sqlfiddle.com/#!3/17e16f/1
猜你喜欢
  • 1970-01-01
  • 2019-10-13
  • 2022-12-16
  • 1970-01-01
  • 2022-01-22
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多