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

在我进行了一些更新后再次发布。

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

假设值在波动,从 1 到 4,再到 3,再到 1,再到 1,再到 1。

一些示例数据

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 |

我想按它们波动的顺序显示每个值,但将它们组合在一起。因此,您只会按顺序看到 1、4、3、1,而不是最近的三个 1。

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

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”等对值进行分组?

【问题讨论】:

  • 值'1'是否应该在结果集中出现两次?
  • @Michael - 同一张海报,他说他正在转发
  • 编辑之前的问题比在同一问题上发布新问题要好...
  • 你的最后一行 id 为 1 有点混乱

标签: sql sql-server-2005 stored-procedures


【解决方案1】:

怎么样:

;WITH data AS
(
SELECT 1 as [value],'2012-03-07' as date
UNION ALL SELECT 1,'2012-03-06'
UNION ALL SELECT 1,'2012-03-05'
UNION ALL SELECT 3,'2012-03-04'
UNION ALL SELECT 4,'2012-03-03'
UNION ALL SELECT 1,'2012-03-02'
)
,data2 AS
(
SELECT 
[Value]
,date
,row_number() OVER (ORDER BY (SELECT NULL)) as row1
FROM data
)
,data3 AS
(
SELECT * 
, row1 - row_number() OVER (ORDER BY [Value]) as row2
from data2
)
SELECT 
MIN([Value]) AS [Value]
,MIN(Date) as Date
FROM data3
GROUP BY [Value] - row2
ORDER BY MIN(row1)

【讨论】:

  • 临时表来救援!不错@Davin。 +1
【解决方案2】:
SELECT VALUE,MIN(date_loaded)
FROM  YOURTABLE
GROUP BY VALUE;

【讨论】:

  • 这不是将所有内容分组到各自的值中,因此不是每次更改?我只会得到 1 | 2012-03-05 | 3 | 2012-03-04 | 4 | 2012-03-03 |
【解决方案3】:

这个解决方案有点复杂,但也许能解决问题。不幸的是,我并没有想到所有的代码,但这里有一个适合初学者的概念方法:

首先,您创建一个包含 row_counter 的临时表选择。像这样:

(SELECT value, date_loaded, row_number() over (partition by date_loaded) as rowNum FROM yourTable) as tempTable1

然后使用某种基于上述临时表 (tempTable1) 的行数 (tempTableCount) 进行迭代的 while 循环。此循环将一次遍历该临时表一行并将该行插入到新的临时表中。每次插入后,您都会跟踪先前插入的值并增加行计数器。如果值发生变化,则执行插入,否则,继续循环。

我的语法可能离得很远(抱歉,不是在带有 sql 的计算机上),但在概念上:

WHILE loopRowCount <= tempTableCount
BEGIN

IF(@previousValue <> (SELECT value from tempTable WHERE rowNum = loopRowCount))
BEGIN
    INSERT INTO tempTable2
    (value, date_loaded)
        (SELECT value, date_loaded FROM tempTable WHERE rowNum = loopRowCount)
END

set @previousValue = (SELECT value FROM tempTable WHERE rowNum = loopRowCount)
loopRowCount = loopRowCount + 1
END

假设您在语法错误弹幕中幸存下来,您的 tempTable2 将包含所需的结果。我会在早上尝试清理它,但这是我今晚得到的最好的!享受! xD

【讨论】:

  • 啊,我明白你在说什么了!谢谢你的帮助,我试试看。
猜你喜欢
  • 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
相关资源
最近更新 更多