获取sql server 2008记录状态的历史记录
假设我有一个Bus Garage应用程序,其中包含一个数据表,表示在车库中、车库外还是在维修车间中的总线。看起来是这样的:获取sql server 2008记录状态的历史记录,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,假设我有一个Bus Garage应用程序,其中包含一个数据表,表示在车库中、车库外还是在维修车间中的总线。看起来是这样的: +-----------------------+-----+-----+ |Date |BusId|State| +-----------------------+-----+-----+ |2013-09-12 15:02:41,844|1 |IN | +-----------------------+-----+-----
+-----------------------+-----+-----+
|Date |BusId|State|
+-----------------------+-----+-----+
|2013-09-12 15:02:41,844|1 |IN |
+-----------------------+-----+-----+
|2013-09-12 15:02:41,844|2 |IN |
+-----------------------+-----+-----+
|2013-09-12 15:02:41,844|3 |OUT |
+-----------------------+-----+-----+
|2013-09-12 15:02:41,844|4 |OUT |
+-----------------------+-----+-----+
|2013-09-12 15:02:41,844|5 |OUT |
+-----------------------+-----+-----+
|2013-09-13 15:02:41,844|1 |OUT |
+-----------------------+-----+-----+
|2013-09-14 15:02:41,844|1 |IN |
+-----------------------+-----+-----+
|2013-09-15 15:02:41,844|1 |OUT |
+-----------------------+-----+-----+
|2013-09-15 15:02:41,844|2 |OUT |
+-----------------------+-----+-----+
现在我想制作一个很好的一天一天(或一小时一小时等)的数据集,让我大致了解车库里有多少辆公交车,以及车库里有多少辆公交车
+-------------------+-----+------------+
|Date |State|Count(buses)|
+-------------------+-----+------------+
|2013-09-12 16:00:00|IN |2 |
+-------------------+-----+------------+
|2013-09-12 16:00:00|OUT |3 |
+-------------------+-----+------------+
|2013-09-13 16:00:00|IN |1 |
+-------------------+-----+------------+
|2013-09-13 16:00:00|OUT |4 |
+-------------------+-----+------------+
|2013-09-14 16:00:00|IN |2 |
+-------------------+-----+------------+
|2013-09-14 16:00:00|OUT |3 |
+-------------------+-----+------------+
|2013-09-15 16:00:00|IN |0 |
+-------------------+-----+------------+
|2013-09-15 16:00:00|OUT |5 |
+-------------------+-----+------------+
仅使用TSQL,我将如何(不需要在代码中解释)执行此操作?
我有一个要求,那就是我不能在我的语句中使用变量声明,因为我将把它作为一个视图
我问了一个非常详细的问题,但我觉得这个问题太冗长了,没有这个问题那么笼统。你真的希望每天/小时有多条记录来显示不同的状态吗?我会把它们做成专栏。您可以使用CTE和
OVER
子句对每天/小时组进行计数:
WITH CTE AS
(
SELECT [Date] = DATEADD(day, DATEDIFF(day, 0, [Date]),0),
[BusId], [State],
[IN] = SUM(CASE WHEN State='IN' THEN 1 END) OVER (PARTITION BY DATEADD(day, DATEDIFF(day, 0, [Date]),0)),
[Out] = SUM(CASE WHEN State='Out' THEN 1 END) OVER (PARTITION BY DATEADD(day, DATEDIFF(day, 0, [Date]),0)),
[DayNum] = ROW_NUMBER() OVER (PARTITION BY DATEADD(day, DATEDIFF(day, 0, [Date]),0)
ORDER BY [Date], [BusID], [State])
FROM dbo.Garage g
)
SELECT [Date], [BusId], [State], [IN], [OUT]
FROM CTE
WHERE [DayNum] = 1
结果:
DATE BUSID STATE IN OUT
September, 12 2013 00:00:00+0000 1 IN 2 3
September, 13 2013 00:00:00+0000 1 OUT (null) 1
September, 14 2013 00:00:00+0000 1 IN 1 (null)
September, 15 2013 00:00:00+0000 1 OUT (null) 2
这甚至在SQLServer2005中也可以使用。如果您想按小时分组而不是按天分组,则必须将DATEADD(day,DATEDIFF(day,0,[Date]),0)
更改为DATEADD(hour,DATEDIFF(hour,0,[Date]),0)
无处不在。试试这个
DECLARE @businfo AS TABLE([date] datetime,busid int,[state] varchar(5))
INSERT INTO @businfo VALUES('2013-09-12 15:02:41',1,'IN')
INSERT INTO @businfo VALUES('2013-09-12 15:02:41',2,'IN')
INSERT INTO @businfo VALUES('2013-09-12 15:02:41',3,'OUT')
INSERT INTO @businfo VALUES('2013-09-12 15:02:41',4,'OUT')
INSERT INTO @businfo VALUES('2013-09-12 15:02:41',5,'OUT')
INSERT INTO @businfo VALUES('2013-09-13 15:02:41',1,'OUT')
INSERT INTO @businfo VALUES('2013-09-14 15:02:41',1,'IN')
INSERT INTO @businfo VALUES('2013-09-15 15:02:41',1,'OUT')
INSERT INTO @businfo VALUES('2013-09-15 15:02:41',2,'OUT')
select [date],[state],COUNT(busid) as [count(buses)] from @businfo
group by [date],[state]
order by [date]
例如:
select Date,State,Count(*)from table group by day(Date),State
该查询遗漏了两件事:它不会给出没有改变状态的总线的日期,也不会考虑特定日期没有改变状态的总线。再次查看所需的结果集。这只是一个提示。(这是这里,不是答案)我想要的最终结果是这样一张表,但我试图将问题简化为核心问题(在我看来),但是你的回答遗漏了一件事:我想让计数汇总属于车库的所有公交车的状态。所以9月的计数是4,1,不是空的,1@Fontanka16当前位置不清楚为什么是4,1。但是,您也可以在(按日期分区添加(day,DATEDIFF(day,0,[Date]),0))上使用[Total]=COUNT(*)来获取每天所有输入输出的计数。或者相应地改变逻辑。如果您想包含BusId
.4,1,甚至可以按多个列进行分区,因为在状态表1中,总线当天改变了状态。结果是4辆公交车出车,1辆在车库里,这只是为了澄清:我不希望查询反映每个日期的状态变化,我希望查询反映该日期所有公交车的状态变化。