我是一名SQL初学者。在询问我的确切问题之前,我想简要介绍一下情景,只是为了说明正确的背景。
我有一个大表,其中包含每次创建,更新或关闭电子令牌时的记录。该表的主键是“HistoryID”,每个令牌都有一个TokenNo,它在一天开始时被回收(即一个带有令牌号的令牌,比如15,不能打开,关闭然后在同一时间重新打开)天)。
下面是该表的快照。如您所见,创建了令牌No 940(状态ID = 1),然后更新为各种状态(2,3,4),然后关闭(10)。之后,随后几天开放的940记录更多。
╔═════════════════╦══════════╦═══════════╦═════════════════════════╗
║ History ID (PK) ║ Token ID ║ Status ID ║ Status Updated On ║
╠═════════════════╬══════════╬═══════════╬═════════════════════════╣
║ 13435 ║ 953 ║ 1 ║ 2013-01-24 16:20:26.957 ║
║ 13436 ║ 940 ║ 1 ║ 2013-01-24 16:20:22.090 ║
║ 13437 ║ 939 ║ 3 ║ 2013-01-24 16:20:30.290 ║
║ 13438 ║ 939 ║ 5 ║ 2013-01-24 16:21:07.387 ║
║ 13439 ║ 940 ║ 2 ║ 2013-01-24 16:21:09.000 ║
║ 13440 ║ 940 ║ 3 ║ 2013-01-24 16:23:14.510 ║
║ 13441 ║ 940 ║ 4 ║ 2013-01-24 16:23:15.860 ║
║ 13442 ║ 940 ║ 10 ║ 2013-01-24 16:23:30.013 ║
║ 13443 ║ 938 ║ 2 ║ 2013-01-24 16:23:31.657 ║
╚═════════════════╩══════════╩═══════════╩═════════════════════════╝
我需要能够通过与之关联的令牌将记录组合在一起。我看到它的方式,这意味着我需要先按天过滤记录,然后我可以按标记号过滤结果,为每个标记号和每天提供一组记录。然后我可以执行我需要的计算,例如平均从一个状态更改为另一个状态所花费的时间,或者绘制令牌保持打开的持续时间。
我不知道如何做到这一点,任何帮助将不胜感激。我猜这个问题对于有经验的SQL开发人员来说相当简单吗?
提前致谢:)
答案 0 :(得分:0)
只需使用一个简单的CTE或公用表表达式来选择当天所说的令牌,然后就可以根据该CTE进行操作
with temp as
(
select token id ,count(1) as cnt
from table
where status date = getdate()
group by token id
)
<do the operations here >
如果表格非常大,CTE可能会慢一点。在这种情况下,将过滤后的结果放入如下表格中
select token id ,count(1) as cnt
into #temp
from table
where status date = getdate()
group by token id
答案 1 :(得分:0)
WITH CTE1
AS
(SELECT History ID, MAX(Token ID), MAX(Status ID), Status Updated On
FROM Table
GROUP BY History ID, Status Updated On)
/* Status Updated On looks like a DateTime, so if you're grouping by date
you'll want to do CONVERT(DATE, Status Updated On) in the GROUP BY */
SELECT * FROM CTE1
/* Choose the calculations, aggregations or arithmetic operations you need
to do here with CTE1. Important note, you are now selecting from
CTE1.Column*/
希望这对您有所帮助或足够帮助您开始使用!
编辑:我重读了您的问题,看起来您正在尝试按令牌ID而非历史ID进行分组(我认为?)WITH CTE1
AS
(SELECT MAX(History ID), Token ID, MAX(Status ID), Status Updated On
FROM Table
GROUP BY Token ID, Status Updated On)
SELECT * FROM CTE1