sql - 在 T-SQL 中按状态对客户进行分组

标签 sql sql-server

我有一个这样的表:

customer_id mis_date  status
----------------------------
 10003       2014-01-01  1   
 10003       2014-01-02  1    
 10003       2014-01-03  0   
 10003       2014-01-04  0   
 10003       2014-01-05  0   
 10003       2014-01-06  1   
 10003       2014-01-07  1    
 10003       2014-01-08  1    
 10003       2014-01-09  1    
 10003       2014-01-10  0   
 10003       2014-01-11  0   
 10003       2014-01-12  0   
 10003       2014-01-13  1     
 10003       2014-01-14  1     
 10003       2014-01-15  1     

我正在尝试构建“组”列:

customer_id mis_date status group
----------------------------------
 10003       2014-01-01  1    1
 10003       2014-01-02  1    1
 10003       2014-01-03  0   NULL
 10003       2014-01-04  0   NULL
 10003       2014-01-05  0   NULL
 10003       2014-01-06  1    2
 10003       2014-01-07  1    2
 10003       2014-01-08  1    2
 10003       2014-01-09  1    2
 10003       2014-01-10  0   NULL
 10003       2014-01-11  0   NULL
 10003       2014-01-12  0   NULL
 10003       2014-01-13  1     3
 10003       2014-01-14  1     3
 10003       2014-01-15  1     3

有人知道如何建立这个群组专栏吗?

逻辑:每天我都会跟踪客户状态,并且我想知道每天该状态在客户历史记录中发生的次数是多少,但仅限于当他处于该状态时。

例如:first_time - 1、second_time - 2 等。

我绞尽脑汁,找不到解决办法。我想事情没那么复杂。

谢谢!

最佳答案

这样的事情应该有效:

;WITH CTE AS (
   SELECT customer_id, mis_date, status,
          ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY mis_date) - 
          ROW_NUMBER() OVER (PARTITION BY customer_id, status ORDER BY mis_date) AS grp
   FROM mytable
), CTE2 AS (
   SELECT customer_id, status, grp, 
          ROW_NUMBER() OVER (ORDER BY MIN(mis_date)) AS rn
   FROM CTE
   WHERE status = 1
   GROUP BY customer_id, status, grp 
)
SELECT c.customer_id, c.mis_date, c.status, rn       
FROM CTE c
LEFT JOIN CTE2 c2 
   ON c.customer_id = c2.customer_id AND c.status = c2.status AND c.grp = c2.grp
ORDER BY mis_date

CTE 标识具有相同status 值的连续记录岛。 CTE2 枚举 status = 1 子组。

关于sql - 在 T-SQL 中按状态对客户进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54387610/

相关文章:

sql - 如何在选择查询中递增

sql-server - Akka.NET 与 SQL Server 的持久性不起作用

sql - 插入触发器上不存在 Postgres 错误关系 "new"

sql - 使用 LIMIT 进行慢速查询(Active Record `first` 方法)

sql-server - SQL Powershell错误: Invoke-Sqlcmd : The term 'Invoke-Sqlcmd' is not recognized as the name of a cmdlet

sql-server - 文件的目录查找...失败,出现操作系统错误 5(访问被拒绝。)

c# - 将 T-SQL 语句解析为标记

android - 如何从 SQLite 中检索特定列并将其显示在 Android 中的 ListView 表单中?

php - SQL - 组合查询

sql - 无法访问 Big Query 中的字段,类型为 ARRAY<STRUCT<hitNumber INT64,时间 INT64,小时 INT64,...>>