【问题标题】:SQL server 2005 - grouping values, display only changesSQL server 2005 - 分组值,仅显示更改
【发布时间】:2012-03-07 11:36:49
【问题描述】:

我正在尝试对一组值进行分组,但我只想在有变化时显示这些值。

一些示例数据

value | date_loaded | 
  1   |  2012-03-07 |
  1   |  2012-03-06 |
  1   |  2012-03-05 |
  3   |  2012-03-04 |
  4   |  2012-03-03 |
  1   |  2012-03-02 |

所以我想显示最新的值,以及它的最早日期,例如

value | date_loaded | 
  1   |  2012-03-05 |
  3   |  2012-03-04 |
  4   |  2012-03-03 |
  1   |  2012-03-02 |

解决此问题的最佳方法是什么?是否可以做一个if语句?如果值 1 与值 2 不同,+1 表示“改变”?因此我可以按“change1”、“change2”等对值进行分组?

【问题讨论】:

  • 嗯,我确实有一个自动生成的行号
  • 有什么快乐吗?希望这是有道理的。
  • 你能使用像YYYY-MM-DD这样的明确日期格式吗?我不知道这些是连续的几天还是每个月的第三天。如果那里有更多行(例如1 | 1/03/12),您还可以描述您想要的内容吗?你只关心最新的不重复吗?
  • 日期格式实际上是日期时间 07/03/2012 12:46:48,但这里使用的日期是 2012 年 3 月 5 日、2012 年 3 月 4 日。我最关心的是何时显示值与之前的值不同,但能够按日期订购将是一个加号。
  • 那不是日期时间格式,即英国英语/加拿大等格式。如果您只是说SELECT datetime_col FROM table,您将不会得到07/03/2012(尽管如果您打印或您的客户端应用程序已根据您的本地设置将其转换为字符串,这可能是您看到的方式)。而且你不应该这样 - 看看我对你的日期意味着什么感到困惑?

标签: sql-server-2005 stored-procedures


【解决方案1】:

我会使用公用表表达式来包含基于 date_loaded 的连续行号,然后在自联接中使用它,如下所示:

CREATE TABLE #temp (
    value INT,
    date_loaded DATETIME
)

INSERT INTO #temp VALUES (1,'2012-03-7')
INSERT INTO #temp VALUES (1,'2012-03-6')
INSERT INTO #temp VALUES (1,'2012-03-5')
INSERT INTO #temp VALUES (3,'2012-03-4')
INSERT INTO #temp VALUES (4,'2012-03-3')
INSERT INTO #temp VALUES (1,'2012-03-2')

;WITH cte AS (SELECT ROW_NUMBER() OVER (ORDER BY date_loaded) AS n, value, date_loaded FROM #temp)
SELECT t2.value, t2.date_loaded
FROM cte t2 LEFT JOIN cte t1 ON t2.n = t1.n + 1
WHERE t2.value <> ISNULL(t1.value, -1)

DROP TABLE #temp

【讨论】:

  • 嗯我已经修改了一些代码,但它似乎不起作用,临时表的示例也没有(收到错误“消息 102,级别 15,状态 1,第 6 行不正确',' 附近的语法。"
  • @Rexxo 那是 2008 年的语法……我把它更新到了 2005 年;你能再试一次吗?
  • 啊!就是这样!我也把它和我的代码放在了一起,它很有魅力。感谢彼得和@MichaelFredrickson
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 2010-10-10
  • 2011-03-28
  • 1970-01-01
相关资源
最近更新 更多