2014-10-27 58 views
0

我有这样一个数据:T-SQL数多列更改

a,x,1 
a,x,2 
a,y,5 
a,z,5 
a,t,5 
a,s,6 
b,x1,11 
b,x1,21 
b,y1,51 
b,z1,51 
b,t1,51 

我想算值的变化,但如果第二场和第三场的值没有改变;这不是一个变化。第2和第3字段值必须更改。

在我上面的例子中;第1行到第2行不是一个变化,但第2行到第3行是变化的,因为x和2值都被改变了。再次,第3行到第4行是一个变化。

我想查询有结果作为

a,3 
b,2 

谢谢。

+0

你可以只发布所需的输出..问题不明确 – mohan111 2014-10-27 10:09:52

+0

我已经添加输出与我的编辑。 a,2 b,2 – 2014-10-27 10:26:02

+2

你说“第2和第3字段值必须改变。”? “第三排到第四排如何变化”?第三场值保持不变(5)。 – 2014-10-27 10:36:05

回答

0

从您的问题实际上,a和b的计数都是1. Becoz只有一次两行都有变化。

CREATE TABLE #t 
    (
    col1 VARCHAR(10), 
    col2 VARCHAR(10), 
    col3 INT 
) 

INSERT INTO #t 
VALUES  ('a','x',1), 
      ('a','x',2), 
      ('a','y',5), 
      ('a','z',5), 
      ('b','x1',11), 
      ('b','x1',21), 
      ('b','y1',51), 
      ('b','z1',51), 
      ('b','t1',51); 

WITH cte 
    AS (SELECT Dense_rank() 
        OVER(
        partition BY col1 
        ORDER BY col2) col1_rn, 
       Dense_rank() 
        OVER(
        partition BY col1 
        ORDER BY col3) col2_rn, 
       * 
     FROM #t) 
SELECT a.col1, 
     Count(1) AS [count] 
FROM cte a 
     LEFT JOIN cte b 
       ON a.col1 = b.col1 
       AND a.col1_rn = b.col1_rn + 1 
       AND a.col2_rn = b.col2_rn + 1 
WHERE b.col1_rn IS NOT NULL 
GROUP BY a.col1 
+0

非常感谢Pradeep。你是一个专业人士,我可以从你的代码中看到。但在我的例子中,a和b都变化了2次。在行1和行2中基于col2相等(因为x值相同),在行3和行4中基于列3相等(因为5个值相同)。谢谢。 – 2014-10-27 11:51:55

+0

@MERTDOĞAN说真的,我没有明白你的观点。你清楚地提到“col2和col3必须改变”,那么只有row2('a','x',2)变成row3('a','y',5)。和row2('b','x1',21)改为row3('b','y1',51),除此之外,我没有看到col2和col3都在改变。 – 2014-10-27 12:38:33

+0

当然你还好,但我的价值观数据和你的不相等。如果您尝试将我的价值数据用于您的代码;它仍然生成相同的值a,1b,1。刷新此页面,如果您尝试使用新数据的代码;你会看到它仍然产生相同的结果。 – 2014-10-27 13:19:20