Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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_Nested_Max_Composite - Fatal编程技术网

如何在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)