Sql 如何选择每天最新的时间戳
我每小时都有一个报告,显示数据库的磁盘空间使用情况。 然后通过电子邮件发送 我想将其更改为显示上次快照日期的统计信息 数据如下Sql 如何选择每天最新的时间戳,sql,sql-server,tsql,greatest-n-per-group,Sql,Sql Server,Tsql,Greatest N Per Group,我每小时都有一个报告,显示数据库的磁盘空间使用情况。 然后通过电子邮件发送 我想将其更改为显示上次快照日期的统计信息 数据如下 Day Date Time WeekNo Data_Size_MB Used_Data_MB Friday 10-Mar-17 11:00 11 118784 92670.33 Friday 10-Mar-17 10:00 11 118784 92653.96 Friday 10-Mar-17 09:00
Day Date Time WeekNo Data_Size_MB Used_Data_MB
Friday 10-Mar-17 11:00 11 118784 92670.33
Friday 10-Mar-17 10:00 11 118784 92653.96
Friday 10-Mar-17 09:00 11 118784 92641.16
Friday 10-Mar-17 08:00 11 118784 92636.39
Friday 10-Mar-17 07:00 11 118784 92584.42
Thursday 09-Mar-17 23:00 11 118784 92586.25
Thursday 09-Mar-17 22:00 11 118784 92586.06
Thursday 09-Mar-17 21:00 11 118784 92585.85
下面的sql
select Day = datename(dw,snapshot_Date),
Date = convert(varchar(19), Snapshot_Date, 106),
Time = substring(CONVERT(VARCHAR, snapshot_Date, 108),0,6),
WeekNo = DATEPART(week, snapshot_Date),
Data_Size_MB = Data_Size_MB,
Used_Data_MB = Used_Data_MB,
Data_Full_Pcnt = Data_Full_Pcnt,
Log_Size_MB = Log_Size_MB,
Free_Log_MB = Free_Log_MB,
Log_Full_Pcnt = Log_Full_Pcnt,
snapshot_Date
from Ideal_Risk.dbo.Sybase_Disk_Space
where database_name='IDEAL'
order by snapshot_date desc
但我希望它能回来
Day Date Time WeekNo Data_Size_MB Used_Data_MB
Friday 10-Mar-17 11:00 11 118784 92670.33
Thursday 09-Mar-17 23:00 11 118784 92586.25
ie每天的最后一张快照
注意:我已经切掉了数据中返回的一些列,解决方案是创建一个中间表,在其中每个日期添加一个行号。然后,每个日期只能选择第一行
select *,
ROW_NUMBER() OVER(PARTITION BY Date ORDER BY Date DESC) AS rownum
into #some_temp
from Ideal_Risk.dbo.Sybase_Disk_Space
where database_name='IDEAL'
select Day = datename(dw,snapshot_Date),
Date = convert(varchar(19), Snapshot_Date, 106),
Time = substring(CONVERT(VARCHAR, snapshot_Date, 108),0,6),
WeekNo = DATEPART(week, snapshot_Date),
Data_Size_MB = Data_Size_MB,
Used_Data_MB = Used_Data_MB,
Data_Full_Pcnt = Data_Full_Pcnt,
Log_Size_MB = Log_Size_MB,
Free_Log_MB = Free_Log_MB,
Log_Full_Pcnt = Log_Full_Pcnt,
snapshot_Date
from #some_temp
where database_name='IDEAL' and rownum = 1
当然,您也可以从(选择…)b执行嵌套的
您可以像这样使用CTE
with mondayTable as(
select Day = datename(dw,snapshot_Date),
Date = convert(varchar(19), Snapshot_Date, 106),
Time = substring(CONVERT(VARCHAR, snapshot_Date, 108),0,6),
WeekNo = DATEPART(week, snapshot_Date),
Data_Size_MB = Data_Size_MB,
Used_Data_MB = Used_Data_MB,
Data_Full_Pcnt = Data_Full_Pcnt,
Log_Size_MB = Log_Size_MB,
Free_Log_MB = Free_Log_MB,
Log_Full_Pcnt = Log_Full_Pcnt,
snapshot_Date
from Ideal_Risk.dbo.Sybase_Disk_Space
where database_name='IDEAL' and datename(dw,snapshot_Date) = 'Monday'
order by snapshot_date desc
)
tuesdayTable as(
select Day = datename(dw,snapshot_Date),
Date = convert(varchar(19), Snapshot_Date, 106),
Time = substring(CONVERT(VARCHAR, snapshot_Date, 108),0,6),
WeekNo = DATEPART(week, snapshot_Date),
Data_Size_MB = Data_Size_MB,
Used_Data_MB = Used_Data_MB,
Data_Full_Pcnt = Data_Full_Pcnt,
Log_Size_MB = Log_Size_MB,
Free_Log_MB = Free_Log_MB,
Log_Full_Pcnt = Log_Full_Pcnt,
snapshot_Date
from Ideal_Risk.dbo.Sybase_Disk_Space
where database_name='IDEAL' and datename(dw,snapshot_Date) = 'Tuesday'
order by snapshot_date desc
)
SELECT *
FROM mondayTable
UNION ALL
SELECT *
FROM tuesdayTable
您应该能够使用行编号()
:
我们可以省略ROW_NUMBER()函数的使用和每行的编号
在下面的查询中,我在CTE(LatestDailySnapshot
)中查找按日期分组(CAST(Snapshot\u Date AS Date)
)的每天的最大Snapshot\u Date
),然后将结果连接到原始表以提取这些日期的记录
DECLARE @DatabaseName VARCHAR(50) = 'IDEAL';
WITH LatestDailySnapshot AS
(
SELECT MAX(Snapshot_Date) AS Latest_Snapshot_Date
FROM Ideal_Risk.dbo.Sybase_Disk_Space
WHERE Database_Name = @DatabaseName
GROUP BY CAST(Snapshot_Date AS Date)
)
SELECT *
FROM Ideal_Risk.dbo.Sybase_Disk_Space
WHERE Database_Name = @DatabaseName
JOIN LatestDailySnapshot ON Latest_Snapshot_Date = Snapshot_Date
ORDER BY snapshot_date
注1:如果在(数据库名称、快照日期
)上有索引,则会更有效
注2:如果每个(Database\u Name
,Snapshot\u Date
)组合有多行,这种方法将无法正常工作。这意味着以下查询不应返回任何结果:
SELECT Database_Name, Snapshot_Date, COUNT(*) AS RowsPerCombination
FROM Ideal_Risk.dbo.Sybase_Disk_Space
GROUP BY Database_Name, Snapshot_Date
HAVING COUNT(*) > 1
SELECT Database_Name, Snapshot_Date, COUNT(*) AS RowsPerCombination
FROM Ideal_Risk.dbo.Sybase_Disk_Space
GROUP BY Database_Name, Snapshot_Date
HAVING COUNT(*) > 1