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