SQL分组结果

时间:2014-10-10 13:09:23

标签: sql sql-server sql-server-2008-r2

我试图让用户最后一次更新表格

Declare @Collect Table (Name Varchar(100),last_user_update datetime)
Insert into @Collect
EXEC sp_MSForEachTable 'SELECT ''?'' as TableName, 
                                     last_user_update 
                        FROM sys.dm_db_index_usage_stats 
                        WHERE database_id = DB_ID(''SP3D_DB_RESEARCH_MDB'') AND OBJECT_ID =     OBJECT_ID(''?'')' 
SELECT * FROM @Collect ORDER BY last_user_update DESC 

问题在于,在结果中,有些表格出现了3次(请参见下图)

query results

由于看起来所有重复的表都具有相同的上次更新时间。有没有办法按表名对结果进行分组?

2 个答案:

答案 0 :(得分:1)

如果值确实相同,您只需将DISTINCT添加到查询中,然后让它返回唯一结果

SELECT DISTINCT ''?'' as TableName, last_user_update  ...

如果您想在事后分组,并且只有最后一次更新感兴趣,您可以

SELECT TableName, max(last_user_update) as last_update 
FROM @Collect 
GROUP BY TableName
ORDER BY 2 DESC

答案 1 :(得分:1)

表可以有多个索引。动态管理视图sys.dm_db_index_usage_stats将为每个索引分别创建条目。

如果要查看每个索引的名称,请尝试以下操作:

SELECT
    o.name as TableName,
    i.name as IndexName,
    istats.last_user_update
from sys.dm_db_index_usage_stats istats
inner join sys.objects o
    on o.object_id = istats.object_id
inner join sys.indexes i
    on i.index_id = istats.index_id
    and i.object_id = istats.object_id
order by
    o.name,
    i.name

或者,如果您不关心这一点,只想要上次更新时间,您可以按表名分组:

SELECT
    o.name as TableName,
    max(istats.last_user_update)
from sys.dm_db_index_usage_stats istats
inner join sys.objects o
    on o.object_id = istats.object_id
group by
    o.name

您可以使用此查询直接在表格中插入:

declare @Collect table (Name varchar(100),last_user_update datetime)
insert into @Collect
select
    o.name as TableName,
    istats.last_user_update
from sys.dm_db_index_usage_stats istats
inner join sys.objects o
    on o.object_id = istats.object_id
inner join sys.indexes i
    on i.index_id = istats.index_id
    and i.object_id = istats.object_id
where database_id = db_id('SP3D_DB_RESEARCH_MDB')

此外,我不确定您的目标是什么,但请理解此视图仅包含对其有活动的索引的条目。如果索引未使用,则不在此视图中。第一次访问在视图中创建一行。这个视图中真正有趣的东西是搜索和扫描信息。

请参阅MSDN上的此说明:

  

使用索引时,会向sys.dm_db_index_usage_stats添加一行   如果索引尚不存在行。添加行时,   其计数器最初设置为零。

如果您的目标是枚举所有索引,然后显示所有索引的最后更新日期,则需要加入sys.indexes,然后将其连接到sys.dm_db_index_usage_stats。