如何使用“Partition By”或“Max”? SQL 服务器
How to use “Partition By” or “Max”? for SQL Server
我有一个与此处针对 Oracle DB 提出的问题非常相似的问题(但我有一个 SQL Server 2012)。我用作入门者的示例基于给出的答案 here.
我有这四列:
[L2] ,[DateofReporting],[L3]
和 [ServerName]
或多或少在随机的一天将数据添加到 table,但如果是,它将始终相同 [L2],[DateofReporting]
,[L3]
但有不同的 [ServerName]
现在我想提取该数据以提供所有服务器 [ServerName]
,这些服务器是按 L2
、L3
和相关月份分组的所有月份和年份的最后添加和年份(来自 [DateofReporting]
)。
SELECT [ID],[L2],[DateofReporting],[L3],[ServerName]
FROM (
select *,
max([DateofReporting])
OVER (PARTITION BY YEAR([DateofReporting]),
Month([DateofReporting])) maxdate
from [EADATAGOV].[Governance].[ToDos]
)max_date
where [DateofReporting] = maxdate
我正在解决的问题是,数据不完整,它们显然是我陈述中的错误。到目前为止,我还没有看到森林中的树木,请你帮我清理那个 SQL 语句,或者如果有更聪明的方法,我愿意接受建议。
我正在考虑利用 ROW_NUMBER()
来标记相关条目,而不是对它们做 select,但我以前从未使用过它。
谢谢一月
输出示例:
ID L2 DateofReporting L3 name
18214 Summer 2017-09-20 cloud BINHAS01105 <--
18215 Summer 2017-09-20 lightbulb BINHAS60276 <--
18217 Summer 2017-09-20 lightbulb CNAHAS62003 <--
15297 Summer 2017-09-15 cloud CINHAS01105
15298 Summer 2017-09-15 boat CINHAS60277
15300 Summer 2017-09-15 lightbulb DNAHAS62003
10512 Summer 2017-08-20 lightbulb DNAHAS62003 <--
指出的是我希望在结果中看到的那些。例如。 boat 没有比 09-15 更新的条目。
新方法:
Select [L2],
MAX([DateofReporting]) LDateOfTest
from [EADATAGOV].[Governance].[ToDos]
group by [L2], YEAR([DateofReporting]), Month([DateofReporting]) ,[DType]
having DType= 'test'
order by LDateOfTest desc, L2 desc
这为我(正确地)提供了每个 L2 每个月的最新日期。现在理论上我应该能够在 L2 和 LDateOfTest 匹配的相同 table 上使用另一个查询。
我对 subselect 的想法不起作用,因为我只能通过一个标准,而不是两个。但我不知道它是如何工作的,你能帮我做一下 join(?) 吗?
很难理解您的要求,因为您没有post任何样本数据(输入)。
据我了解,也许我们可以从这个查询开始。你能试试吗,请告诉我?
SELECT ID
,L2
,DATEOFREPORTING
,L3
,SERVERNAME
FROM(
SELECT ID
,L2
,DATEOFREPORTING
,L3
,SERVERNAME
,ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DATEOFREPORTING DESC) RN
FROM TODOS
) A
WHERE RN = 1;
Select [ID],[L2],[DateofReporting],[L3],[ServerName]
From(
Select [ID],[L2],[DateofReporting],[L3],[ServerName],
Row_NUmber() Over(Partition BY [ServerName],[L3] Order BY [DateofReporting] Desc) as Row_Num
from [EADATAGOV].[Governance].[ToDos]
) Temp
Where Row_Num = 1
这就是我经过几个小时的努力得出的解决方案。我不得不完全重新设置我的方法。
IF OBJECT_ID('tempdb..#tmp_table') IS NOT NULL DROP TABLE #tmp_table
Select [L2],
MAX([DateofReporting]) LDateOfTest
into #tmp_table --(L2t, LDateOfTest)
from [EADATAGOV].[Governance].[ToDos]
group by [L2], YEAR([DateofReporting]), Month([DateofReporting]) ,[DType]
having DType = 'test'
order by LDateOfTest desc, L2 desc
SELECT [ID]
,[EADATAGOV].[Governance].[ToDos].[L2] L2f
,YEAR([DateofReporting]) YoT, Month([DateofReporting]) MoT
,[L3]
,[ServerName]
FROM [EADATAGOV].[Governance].[ToDos]
right join #tmp_table tt on tt.L2 = [EADATAGOV].[Governance].[ToDos].[L2] and tt.LDateOfTest = ToDos.DateofReporting
where DType = 'test'
order by DateofReporting desc, L3 asc
DROP TABLE #tmp_table
它可能不是最好的解决方案,但它让我得到了我希望的结果。
我有一个与此处针对 Oracle DB 提出的问题非常相似的问题(但我有一个 SQL Server 2012)。我用作入门者的示例基于给出的答案 here.
我有这四列:
[L2] ,[DateofReporting],[L3]
和 [ServerName]
或多或少在随机的一天将数据添加到 table,但如果是,它将始终相同 [L2],[DateofReporting]
,[L3]
但有不同的 [ServerName]
现在我想提取该数据以提供所有服务器 [ServerName]
,这些服务器是按 L2
、L3
和相关月份分组的所有月份和年份的最后添加和年份(来自 [DateofReporting]
)。
SELECT [ID],[L2],[DateofReporting],[L3],[ServerName]
FROM (
select *,
max([DateofReporting])
OVER (PARTITION BY YEAR([DateofReporting]),
Month([DateofReporting])) maxdate
from [EADATAGOV].[Governance].[ToDos]
)max_date
where [DateofReporting] = maxdate
我正在解决的问题是,数据不完整,它们显然是我陈述中的错误。到目前为止,我还没有看到森林中的树木,请你帮我清理那个 SQL 语句,或者如果有更聪明的方法,我愿意接受建议。
我正在考虑利用 ROW_NUMBER()
来标记相关条目,而不是对它们做 select,但我以前从未使用过它。
谢谢一月
输出示例:
ID L2 DateofReporting L3 name
18214 Summer 2017-09-20 cloud BINHAS01105 <--
18215 Summer 2017-09-20 lightbulb BINHAS60276 <--
18217 Summer 2017-09-20 lightbulb CNAHAS62003 <--
15297 Summer 2017-09-15 cloud CINHAS01105
15298 Summer 2017-09-15 boat CINHAS60277
15300 Summer 2017-09-15 lightbulb DNAHAS62003
10512 Summer 2017-08-20 lightbulb DNAHAS62003 <--
指出的是我希望在结果中看到的那些。例如。 boat 没有比 09-15 更新的条目。
新方法:
Select [L2],
MAX([DateofReporting]) LDateOfTest
from [EADATAGOV].[Governance].[ToDos]
group by [L2], YEAR([DateofReporting]), Month([DateofReporting]) ,[DType]
having DType= 'test'
order by LDateOfTest desc, L2 desc
这为我(正确地)提供了每个 L2 每个月的最新日期。现在理论上我应该能够在 L2 和 LDateOfTest 匹配的相同 table 上使用另一个查询。 我对 subselect 的想法不起作用,因为我只能通过一个标准,而不是两个。但我不知道它是如何工作的,你能帮我做一下 join(?) 吗?
很难理解您的要求,因为您没有post任何样本数据(输入)。 据我了解,也许我们可以从这个查询开始。你能试试吗,请告诉我?
SELECT ID
,L2
,DATEOFREPORTING
,L3
,SERVERNAME
FROM(
SELECT ID
,L2
,DATEOFREPORTING
,L3
,SERVERNAME
,ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DATEOFREPORTING DESC) RN
FROM TODOS
) A
WHERE RN = 1;
Select [ID],[L2],[DateofReporting],[L3],[ServerName]
From(
Select [ID],[L2],[DateofReporting],[L3],[ServerName],
Row_NUmber() Over(Partition BY [ServerName],[L3] Order BY [DateofReporting] Desc) as Row_Num
from [EADATAGOV].[Governance].[ToDos]
) Temp
Where Row_Num = 1
这就是我经过几个小时的努力得出的解决方案。我不得不完全重新设置我的方法。
IF OBJECT_ID('tempdb..#tmp_table') IS NOT NULL DROP TABLE #tmp_table
Select [L2],
MAX([DateofReporting]) LDateOfTest
into #tmp_table --(L2t, LDateOfTest)
from [EADATAGOV].[Governance].[ToDos]
group by [L2], YEAR([DateofReporting]), Month([DateofReporting]) ,[DType]
having DType = 'test'
order by LDateOfTest desc, L2 desc
SELECT [ID]
,[EADATAGOV].[Governance].[ToDos].[L2] L2f
,YEAR([DateofReporting]) YoT, Month([DateofReporting]) MoT
,[L3]
,[ServerName]
FROM [EADATAGOV].[Governance].[ToDos]
right join #tmp_table tt on tt.L2 = [EADATAGOV].[Governance].[ToDos].[L2] and tt.LDateOfTest = ToDos.DateofReporting
where DType = 'test'
order by DateofReporting desc, L3 asc
DROP TABLE #tmp_table
它可能不是最好的解决方案,但它让我得到了我希望的结果。