如何在SQL中获得最大的复合数据?
表->如何在SQL中获得最大的复合数据?,sql,sql-server,nested,max,composite,Sql,Sql Server,Nested,Max,Composite,表-> SELECT "Name""Month","Year","Value" from Table WHERE "Name" LIKE '%JERRY%' AND "Year" = (SELECT MAX("Year") FROM Table where "Name" LIKE '%JERRY%') AND "Month"= (SELECT MAX("Month") FROM Table where "Name" LIKE '%JE
SELECT "Name""Month","Year","Value"
from Table
WHERE
"Name" LIKE '%JERRY%'
AND "Year" =
(SELECT MAX("Year") FROM Table where "Name" LIKE '%JERRY%')
AND "Month"=
(SELECT MAX("Month") FROM Table
where
"Name" LIKE '%JERRY%'
AND "Year"= (SELECT MAX("Year") FROM Table where "Name" LIKE '%JERRY%'))
所以我想要前三行作为输出。至于最近一年的最近一个月,我需要所有的值。
有人能提出一个更清晰的查询吗
Name | Year | Month | Value
-----------------------------
JERRY 2012 9 100
JERRY 2012 9 120
JERRY 2012 9 130
JERRY 2012 8 20
JERRY 2011 12 50
结果
上述查询仅适用于单个用户。对于多个用户,或者在连接的情况下,将失败。例如,考虑下面的场景
在这种情况下,所需的输出将是
因此,为了应对这种情况,我提出以下解决方案
解决方案1
或
解决方案2 Sql Server 2005+
解决方案3 Sql Server 2005+
ddl如下所示
Select Name,[Year],[Month],Value
From
(
Select *,Rn = Dense_Rank() Over(Partition By Name Order By [Year] desc, [Month] Desc)
From @t
)X Where X.Rn =1
希望这能有所帮助。谢谢
结果
上述查询仅适用于单个用户。对于多个用户,或者在连接的情况下,将失败。例如,考虑下面的场景
在这种情况下,所需的输出将是
因此,为了应对这种情况,我提出以下解决方案
解决方案1
或
解决方案2 Sql Server 2005+
解决方案3 Sql Server 2005+
ddl如下所示
Select Name,[Year],[Month],Value
From
(
Select *,Rn = Dense_Rank() Over(Partition By Name Order By [Year] desc, [Month] Desc)
From @t
)X Where X.Rn =1
希望这能有所帮助。谢谢如果表中还有其他人,那么您可能需要使用排名功能:类似于:
DECLARE @t Table(Name Varchar(30),[Year] Int, [Month] Int,Value Int)
Insert Into @t Values('JERRY' , 2012, 9, 100 )
Insert Into @t Values('JERRY', 2012, 9 , 120)
Insert Into @t Values('JERRY' , 2012, 9 , 130)
Insert Into @t Values('JERRY', 2012 , 8 , 20)
Insert Into @t Values('JERRY', 2011, 12 , 50)
Insert Into @t Values('FERRY' , 2010, 9, 100 )
Insert Into @t Values('FERRY', 2010, 9 , 120)
Insert Into @t Values('FERRY', 2010, 8 , 120)
Insert Into @t Values('JERRY1' , 2012, 9, 100 )
Insert Into @t Values('JERRY1', 2012, 9 , 120)
Insert Into @t Values('JERRY1' , 2012, 9 , 130)
Insert Into @t Values('JERRY1', 2012 , 8 , 20)
Insert Into @t Values('JERRY1', 2011, 12 , 50)
结果如下:
DECLARE @sample TABLE (
[Name] VARCHAR(255)
, [Year] INT
, [Month] INT
, [Value] INT
)
INSERT @sample ([Name], [Year], [Month], [Value])
VALUES ('JERRY', 2012, 9, 100)
, ('JERRY', 2012, 9, 120)
, ('JERRY', 2012, 9, 130)
, ('JERRY', 2012, 8, 20)
, ('JERRY', 2011, 12, 50)
, ('FRED', 2011, 12, 50)
, ('FRED', 2011, 12, 120)
, ('FRED', 2011, 7, 150)
SELECT *
FROM (
SELECT *
, RANK() OVER (PARTITION BY [Name] ORDER BY [Year] DESC, [Month] DESC) AS [rnk]
FROM @sample
)
AS samp
WHERE
samp.[rnk] = 1
如果表中还有其他人,那么您可能希望使用排名函数:类似于:
DECLARE @t Table(Name Varchar(30),[Year] Int, [Month] Int,Value Int)
Insert Into @t Values('JERRY' , 2012, 9, 100 )
Insert Into @t Values('JERRY', 2012, 9 , 120)
Insert Into @t Values('JERRY' , 2012, 9 , 130)
Insert Into @t Values('JERRY', 2012 , 8 , 20)
Insert Into @t Values('JERRY', 2011, 12 , 50)
Insert Into @t Values('FERRY' , 2010, 9, 100 )
Insert Into @t Values('FERRY', 2010, 9 , 120)
Insert Into @t Values('FERRY', 2010, 8 , 120)
Insert Into @t Values('JERRY1' , 2012, 9, 100 )
Insert Into @t Values('JERRY1', 2012, 9 , 120)
Insert Into @t Values('JERRY1' , 2012, 9 , 130)
Insert Into @t Values('JERRY1', 2012 , 8 , 20)
Insert Into @t Values('JERRY1', 2011, 12 , 50)
结果如下:
DECLARE @sample TABLE (
[Name] VARCHAR(255)
, [Year] INT
, [Month] INT
, [Value] INT
)
INSERT @sample ([Name], [Year], [Month], [Value])
VALUES ('JERRY', 2012, 9, 100)
, ('JERRY', 2012, 9, 120)
, ('JERRY', 2012, 9, 130)
, ('JERRY', 2012, 8, 20)
, ('JERRY', 2011, 12, 50)
, ('FRED', 2011, 12, 50)
, ('FRED', 2011, 12, 120)
, ('FRED', 2011, 7, 150)
SELECT *
FROM (
SELECT *
, RANK() OVER (PARTITION BY [Name] ORDER BY [Year] DESC, [Month] DESC) AS [rnk]
FROM @sample
)
AS samp
WHERE
samp.[rnk] = 1
我不明白你的输出要求。另外-样本数据应该包含另一个人的数据,而不仅仅是JERRY的数据?您能在DML中提供这样的数据吗:板条箱表样本[Name]VARCHAR255、[Year]INT、[Month]INT、[Value]INT插入样本[Name]、[Year]、[Month]、[Value]值'JERRY',2012,9100、'JERRY',2012,9120,“JERRY”,2012年,9月,130日,“JERRY”,2012年,8月,20日,“JERRY”,2012年,12月,50日从@sample“code”中选择*我不理解您的输出要求。另外-样本数据应该包含另一个人的数据,而不仅仅是JERRY的数据?您能在DML中提供这样的数据吗:板条箱表样本[Name]VARCHAR255、[Year]INT、[Month]INT、[Value]INT插入样本[Name]、[Year]、[Month]、[Value]值'JERRY',2012,9100、'JERRY',2012,9120,'JERRY',2012,9,130',JERRY',2012,8,20',JERRY',2012,12,50从@sample'code'@NiladriBiswas-di dyou中选择*查看最新查询?@NiladriBiswas-di dyou查看最新查询?我喜欢你的答案,但按[年]*100+月]顺序排序,真的吗?为什么不按[Year]DESC、[Month]DESC订购?@ypercube,按OP订购,所以我希望前三行作为输出。至于最近一年的最近一个月,我需要所有的值@Niladri:这会给出每个名字的第一行最近一年、最近一个月。如果像“%JERRY%”这样的WHERE名称包含在内部子查询中,则结果正是OP想要的结果。过滤由RANK函数完成,WHERE samp。[rnk]=1是的,我明白你的意思。。你是对的。在这种情况下,按名称划分按[Year]desc、[Month]desc排序是不够的。我喜欢你的答案,但按[Year]*100+[Month]desc排序真的吗?为什么不按[Year]DESC、[Month]DESC订购?@ypercube,按OP订购,所以我希望前三行作为输出。至于最近一年的最近一个月,我需要所有的值@Niladri:这会给出每个名字的第一行最近一年、最近一个月。如果像“%JERRY%”这样的WHERE名称包含在内部子查询中,则结果正是OP想要的结果。过滤由RANK函数完成,WHERE samp。[rnk]=1是的,我明白你的意思。。你是对的。在这种情况下,按名称按[Year]desc、[Month]desc进行分区就足够了
DECLARE @sample TABLE (
[Name] VARCHAR(255)
, [Year] INT
, [Month] INT
, [Value] INT
)
INSERT @sample ([Name], [Year], [Month], [Value])
VALUES ('JERRY', 2012, 9, 100)
, ('JERRY', 2012, 9, 120)
, ('JERRY', 2012, 9, 130)
, ('JERRY', 2012, 8, 20)
, ('JERRY', 2011, 12, 50)
, ('FRED', 2011, 12, 50)
, ('FRED', 2011, 12, 120)
, ('FRED', 2011, 7, 150)
SELECT *
FROM (
SELECT *
, RANK() OVER (PARTITION BY [Name] ORDER BY [Year] DESC, [Month] DESC) AS [rnk]
FROM @sample
)
AS samp
WHERE
samp.[rnk] = 1
Name Year Month Value rnk
------------------------- ----------- ----------- ----------- ------
FRED 2011 12 50 1
FRED 2011 12 120 1
JERRY 2012 9 100 1
JERRY 2012 9 120 1
JERRY 2012 9 130 1
select *
from your_table
where "Name" LIKE '%JERRY%'
and year*100+month
in(
select top 1 year*100+month
from your_table
where
"Name" LIKE '%JERRY%'
order by cast(year*100+month as int) desc)