使用SQL游标。担心表现。用set操作有什么方法可以做到这一点吗?

使用SQL游标。担心表现。用set操作有什么方法可以做到这一点吗?,sql,tsql,cursor,Sql,Tsql,Cursor,我正在开发一个不断更新的生产表,它还处于初级阶段,但最终每分钟可能会有多个插入到此表,并且可能会达到数百万个条目。我无法控制表结构或数据的输入方式 我需要计算机器处于设置状态后制作的咖啡的数量。此计数必须至少每15分钟进行一次。该ID用作另一个表中的键,并且必须与输出中的MachineNumber和PartNumber关联。下面是示例输出 以下是我的工作内容: “产量”表: +---------------+---------------------+---------+------------

我正在开发一个不断更新的生产表,它还处于初级阶段,但最终每分钟可能会有多个插入到此表,并且可能会达到数百万个条目。我无法控制表结构或数据的输入方式

我需要计算机器处于设置状态后制作的咖啡的数量。此计数必须至少每15分钟进行一次。该ID用作另一个表中的键,并且必须与输出中的MachineNumber和PartNumber关联。下面是示例输出

以下是我的工作内容:

“产量”表:

+---------------+---------------------+---------+------------+--------+
| MachineNumber |      DateTime       | Comment | PartNumber | Status |
+---------------+---------------------+---------+------------+--------+
|             1 | 11/11/2014 12:12:32 |         |        104 | _SETUP |
|             1 | 11/11/2014 12:12:40 |     155 |        104 | _ID    |
|             1 | 11/11/2014 12:12:45 |         |        104 | _CON   |
|             1 | 11/11/2014 12:16:45 |         |        104 | _COFF  |
|             1 | 11/11/2014 12:16:46 |         |        104 | _CON   |
|             1 | 11/11/2014 12:20:46 |         |        104 | _COFF  |
|             2 | 11/11/2014 12:20:50 |         |        223 | _SETUP |
|             1 | 11/11/2014 12:21:00 |         |        104 | _CON   |
|             1 | 11/11/2014 12:23:00 |         |        104 | _COFF  |
|             2 | 11/11/2014 12:25:00 |     543 |        223 | _ID    |
|             2 | 11/11/2014 12:25:20 |         |        223 | _CON   |
|             2 | 11/11/2014 12:26:20 |         |        223 | _COFF  |
            ...             ...             ...         ...      ...                       
+---------------+---------------------+---------+------------+--------+
目前,我使用光标获得以下输出:

+---------------+------------+-----+-------------+
| MachineNumber |  DateTime  | ID  | _COFF Count |
+---------------+------------+-----+-------------+
|             1 | 11/11/2014 | 155 |           3 |
|             2 | 11/11/2014 | 543 |           1 |
+---------------+------------+-----+-------------+
无论如何,这样做比循环通过一百万个条目要好吗?从我已经循环过的表中删除记录,并将输出存储在另一个表中,怎么样


编辑:每台机器的每个零件只有一个设置和一个ID,但是每台机器将有多个零件,因此表中的每台机器都有多个设置和ID。

最好是创建一个触发器,重置机器的上次设置日期,然后在索引视图中使用它

select table.machinenumber, timestamp.starttime, id.comment, count(*) 
  from table 
  join ( select MachineNumber, min(comment) as commment
           from table
          where Status = '_ID' 
            and comment is not null 
          group by MachineNumber ) as id 
    on id.MachineNumber = table.machinenumber 
  join ( select MachineNumber, min(datetime) as starttime
           from table 
          where Status = '_SETUP'
          group by MachineNumber ) as timestamp 
     on timestamp.ID = table.ID 
    and timestamp.starttime < table.datetime 
    and table.Status = '_CON'
  group by table.machinenumber, timestamp.starttime, id.comment
假设您的表被称为Status:

一切就绪并运行后,只需运行以下查询:

SELECT  s.machineNumber, sls.lastSetup, comment id, cnt
FROM    V_Status_CoffCount scc WITH (NOEXPAND)
JOIN    Status_LastSetup sls
ON      sls.machineNumber = scc.machineNumber
LEFT JOIN
        Status s
ON      s.machineNumber = sls.machineNumber
        AND s.partNumber = sls.partNumber
        AND s.status = '_ID'
它的执行时间与您拥有的机器数量成线性关系,几乎不依赖于状态中的条目数量


请在SQLFiddle上查看所有这些:

一个标志。您的dbms是MySQL或TSQL ms sql,请选择一个。此外,您在此处包含日期/时间,并在所需输出中去除时间,这是否意味着您希望将给定机器/零件/ID的计数分解为计数/天?能否告诉我们表格ID。此外,每个机器编号是否只有一个设置?如果有多个设置怎么办?如果有多个ID怎么办?
SELECT  s.machineNumber, sls.lastSetup, comment id, cnt
FROM    V_Status_CoffCount scc WITH (NOEXPAND)
JOIN    Status_LastSetup sls
ON      sls.machineNumber = scc.machineNumber
LEFT JOIN
        Status s
ON      s.machineNumber = sls.machineNumber
        AND s.partNumber = sls.partNumber
        AND s.status = '_ID'