Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计数状态变化_Sql_Sql Server - Fatal编程技术网

Sql 计数状态变化

Sql 计数状态变化,sql,sql-server,Sql,Sql Server,我想知道是否有可能计算记录中某个值之间的更改次数 例如,我有以下数据 | radio | name | state | timestamp | |-------|------|-------|---------------------| | 1 | AP1 | down | 2013-03-07 10:00:00 | | 1 | AP1 | down | 2013-03-07 10:15:00 | | 1 | AP1 | up | 20

我想知道是否有可能计算记录中某个值之间的更改次数

例如,我有以下数据

| radio | name | state | timestamp           |
|-------|------|-------|---------------------|
| 1     | AP1  | down  | 2013-03-07 10:00:00 |
| 1     | AP1  | down  | 2013-03-07 10:15:00 |
| 1     | AP1  | up    | 2013-03-07 10:30:00 |
| 1     | AP1  | down  | 2013-03-07 10:45:00 |
| 1     | AP1  | pend  | 2013-03-07 11:00:00 |
| 1     | AP1  | pend  | 2013-03-07 11:15:00 |
| 1     | AP1  | pend  | 2013-03-07 11:30:00 |
| 1     | AP1  | pend  | 2013-03-07 11:45:00 |
我需要做一个查询,它执行以下技巧

| name | S1     | S2     | S3       | S4         | (other time range) |
| AP1  | A      | A      | B        | A          | C                  |
                     \      /    \      /    \      /
                      DETECT      DETECT      DETECT    
                            \        \       / 
                             \------- \     /
                                       COUNT = 3 <-- this is the number i want
结果将是

| radio | name | state | count |
|-------|------|-------|-------|
| 1     | AP1  | down  | 3     |
| 1     | AP1  | up    | 1     |
| 1     | AP1  | pend  | 1     |
现在的结果是3行,也就是3个状态改变,但我意识到这不是真的,因为这个数字 只会告诉我不同州名的数量,在这种情况下是3


因此,我的问题是,这在SQL中是可能的,还是我需要将结果集拉入一个循环,并通过外部脚本或视图检测更改。

您可以使用以下方法:

with Changes as
(
  select name
    , stateChange = case when prev.state is null then 0
      when sc.state <> prev.state then 1
      else 0
      end
  from data sc
    outer apply
    (
      select top 1 prev.state
      from data prev
      where sc.timestamp > prev.timestamp
        and sc.name = prev.name
      order by prev.timestamp desc
    ) prev
)
select name, stateChanges = sum(stateChange)
from Changes
group by name

另外,在你的问题中,你的数据有点不一致;有时你提到AP1,有时提到AP2。如果上述查询/小提琴不够,请提供更大的数据集。

您可以使用LAG:

SELECT sq.RADIO,
  sq.NAME,
  COUNT(CASE WHEN sq.STATE != sq.PREV_STATE THEN 1 ELSE NULL END) CHG_COUNT
FROM
  (SELECT 
    td.RADIO,
    td.NAME,
    td.STATE,
    COALESCE(LAG(td.STATE,1) OVER(PARTITION BY td.RADIO, td.NAME ORDER BY td.TIMESTAMP ASC),td.STATE) PREV_STATE
  FROM DATA td) sq
GROUP BY sq.RADIO, 
  sq.NAME

什么版本的SQL Server?mssql版本是2008 R2ah是的,这是一个复制/粘贴错误:修复了它也在使用这个版本,似乎我现在有了一些工作:做一些最终测试,如果它能工作,我会将它标记为解决方案正确,我认为它是在早期版本中实现的。在这种情况下,伊恩的建议相当优雅。