如何使用T-SQL过滤大量数据然后处理结果组?

时间:2017-08-04 09:46:36

标签: sql sql-server tsql

我是一名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开发人员来说相当简单吗?

提前致谢:)

2 个答案:

答案 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