Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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如何将时间序列数据转换为hoc_Sql_Sql Server - Fatal编程技术网

sql如何将时间序列数据转换为hoc

sql如何将时间序列数据转换为hoc,sql,sql-server,Sql,Sql Server,我有一个sql表,它的格式如下- Company Size segment DATE ABC Large cap 01-Mar-98 ABC Large cap 01-Sep-98 ABC Mid cap 01-Mar-99 ABC Mid cap 01-Sep-99 ABC Large cap

我有一个sql表,它的格式如下-

Company Size segment        DATE    
ABC     Large cap           01-Mar-98    
ABC     Large cap           01-Sep-98    
ABC     Mid cap             01-Mar-99    
ABC     Mid cap             01-Sep-99    
ABC     Large cap           01-Mar-00    
我想转换成这种格式-结束日期是每个期间的最后一个日期。例如,第一个“大盘股”期的开始日期为98年3月1日,该期的结束日期为99年2月28日

如何在sql server中执行此操作

谢谢。

试试这个:

SELECT Company, [Size segment], Min(DATE) [Start date], MAX(DATE) [End date]
FROM TableName 
GROUP BY Company, [Size segment]
CREATE TABLE B
(ID INT IDENTITY PRIMARY KEY, [Company] varchar(3), [Size segment] varchar(9), [DATE] datetime)
;

INSERT INTO B
([Company], [Size segment], [DATE])
VALUES
('ABC', 'Large cap', '1998-03-01 00:00:00'),
('ABC', 'Large cap', '1998-09-01 00:00:00'),
('ABC', 'Mid cap', '1999-03-01 00:00:00'),
('ABC', 'Mid cap', '1999-09-01 00:00:00'),
('ABC', 'Large cap', '2000-03-01 00:00:00')
;

;WITH tmp AS (
SELECT id, company, [Size segment], [date], row_number() over(order by DATE) row_index
FROM B
)
select b.*, DATEADD(dd, -1, t2.[date])
from B 
left join tmp t1 ON t1.id = b.id
left join tmp t2 ON t1.row_index + 1 = t2.row_index
WHERE t1.[size segment] <> t2.[size segment]
UNION
select TOP 1 *, NULL
from B
ORDER BY [date] DESC

在您的结果集第一行中,1999年2月28日作为结束日期来自何处?在第三行日期1999年3月1日前一天。即该公司在98年3月和98年9月每半年审查两次,并被视为大盘股公司。在第三次审查期间,它被视为中盘股公司。我希望这反映为一家大型公司,从98年3月到99年2月的一年期。你为什么不更新这个问题,否则你的样本输出没有任何意义!!这是我一开始的想法,但是这个解决方案给了我两行而不是三行,并且开始日期和结束日期重叠对不起,说它工作得太快了。第一行显示为'98年9月1日',而不是'98年3月1日'。如果我有很多证券的时间序列,这个解决方案可能不起作用。我正在试验,但欢迎任何评论。很好。第一行开始日期不正确,但可以通过update命令单独处理。谢谢你的意见。
CREATE TABLE B
(ID INT IDENTITY PRIMARY KEY, [Company] varchar(3), [Size segment] varchar(9), [DATE] datetime)
;

INSERT INTO B
([Company], [Size segment], [DATE])
VALUES
('ABC', 'Large cap', '1998-03-01 00:00:00'),
('ABC', 'Large cap', '1998-09-01 00:00:00'),
('ABC', 'Mid cap', '1999-03-01 00:00:00'),
('ABC', 'Mid cap', '1999-09-01 00:00:00'),
('ABC', 'Large cap', '2000-03-01 00:00:00')
;

;WITH tmp AS (
SELECT id, company, [Size segment], [date], row_number() over(order by DATE) row_index
FROM B
)
select b.*, DATEADD(dd, -1, t2.[date])
from B 
left join tmp t1 ON t1.id = b.id
left join tmp t2 ON t1.row_index + 1 = t2.row_index
WHERE t1.[size segment] <> t2.[size segment]
UNION
select TOP 1 *, NULL
from B
ORDER BY [date] DESC