Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取sql server 2008记录状态的历史记录_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

获取sql server 2008记录状态的历史记录

获取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 | +-----------------------+-----+-----

假设我有一个Bus Garage应用程序,其中包含一个数据表,表示在车库中、车库外还是在维修车间中的总线。看起来是这样的:

+-----------------------+-----+-----+
|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辆在车库里,这只是为了澄清:我不希望查询反映每个日期的状态变化,我希望查询反映该日期所有公交车的状态变化。