[英]SQL grouping results
我試圖獲取用戶最后一次更新表的時間:
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次(請參見下面的圖片)
由於似乎所有重復的表都具有相同的上次更新時間。 有什么方法可以通過表名對結果進行分組?
如果值確實相同,則可以將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
表可以具有多個索引。 動態管理視圖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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.