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 如何选择每天最新的时间戳_Sql_Sql Server_Tsql_Greatest N Per Group - Fatal编程技术网

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