【问题标题】:T-SQL Count Multi-Column ChangesT-SQL 计数多列更改
【发布时间】:2014-10-27 10:06:29
【问题描述】:

我有这样的数据:

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

谢谢。

【问题讨论】:

  • 你能不能只发布所需的输出..问题不清楚
  • 我在编辑中添加了输出。 a,2 b,2
  • 您说“第二个和第三个字段值都必须更改。”?为什么“第 3 行到第 4 行发生变化”?第三个字段值保持不变(5)。
  • 根据您的问题,a 和 b 都只有一个变化,即从“第 2 行到第 3 行”。 Dono 在什么基础上你需要那个结果。
  • 改变手段; col2 和 col3 都必须更改。我想计算不同的更改行。

标签: sql-server tsql count group-by


【解决方案1】:

从您的问题来看,实际上 a 和 b 的计数都是 1。因为只有一次,两行都发生了变化。

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 

【讨论】:

  • 非常感谢 Pradeep。您是专业人士,我可以从您的代码中看出。但在我的示例中,a 和 b 都更改了 2 次。在 row1 和 row2 中,基于 col2 相等(因为 x 值相同),在 row3 和 row4 中,基于 col 3 相等(因为 5 个值相同)。谢谢。
  • @MERTDOĞAN 说真的,我不明白你的意思。您清楚地提到“col2 和 col3 都必须更改”,然后只有 row2('a','x',2) 更改为 row3('a','y',5)。并且 row2('b','x1',21) 更改为 row3('b','y1',51) 除此之外,我没有看到 col2 和 col3 都在变化。
  • 当然可以,但我的价值观数据和你的不相等。如果您尝试将代码与我的值数据一起使用;它仍在生成相同的值 a,1 b,1。刷新此页面,如果您尝试使用新数据编写代码;你会看到它仍然产生相同的结果。
  • @MERTDOĞAN 是的,显然你会得到结果,因为第一行和第二行“x”是相同的。接下来的 3 行 '5' 相同。只有从 5 到 6 两列都有变化,所以 a =1
  • 感谢您的回复 Pradeep。 2 到 3 一切都变了,这是 1 号变更。5 到 6 一切都变了,这是 2 号变更。我想看看这个。
猜你喜欢
  • 2021-08-04
  • 2023-03-31
  • 2021-08-13
  • 2015-08-02
  • 2022-01-09
  • 1970-01-01
  • 2014-09-19
  • 2010-09-07
  • 1970-01-01
相关资源
最近更新 更多