Sql 每年从数据表返回一行
根据以下数据,我只需要显示每年的单行Sql 每年从数据表返回一行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,根据以下数据,我只需要显示每年的单行 AlbumID AlbumIcon Year 2 53575dd7-9e6a-4230-afe7-eb34a9952ef5.jpg 2010 6 41c6cefe-aa9a-40af-86bf-0e78784fc9be.jpg 2011 7 20472dc8-abff-4cb1-80a4-ec264a91025e.jpg 2011 9 a2185c7
AlbumID AlbumIcon Year
2 53575dd7-9e6a-4230-afe7-eb34a9952ef5.jpg 2010
6 41c6cefe-aa9a-40af-86bf-0e78784fc9be.jpg 2011
7 20472dc8-abff-4cb1-80a4-ec264a91025e.jpg 2011
9 a2185c73-debf-4058-afee-dc54caf674d2.jpg 2012
10 3e3de287-b966-40cc-8895-9c9e98f1b23d.jpg 2012
11 f0743e3e-26d8-44ea-97ad-a7bd33259550.JPG 2007
12 dafd1242-19d6-4f66-8b23-75143f107743.JPG 2012
13 d623e134-3d69-4b86-86fe-4c5a2ab89086.JPG 2012
14 9c6b981e-e696-4c85-be6d-3b04559a6cd4.JPG 2012
15 b6b867c0-5478-4503-940c-ce75e863bee8.JPG 2012
16 3cc0d762-f1e1-425a-8923-0e39b4ed0eca.jpg 2012
我的桌子结构是这样的
Album_ID int
Album_Name varchar(100)
Album_Description varchar(500)
Album_Date Datetime
Album_Icon varchar(60)
我正在使用SELECTAlbum\u ID、Album\u Name、Album\u图标、DATEPART(YYYY、Album\u Date)作为Album\u Name中的年份
我不确定如何修改查询以仅获取每年的单行,最新的年份行将非常好
我想在不使用CTE查询的情况下实现这一点
具有DISTINCT的Group by生成错误
SELECT Album_ID, Album_Name,Album_Icon, DISTINCT(DATEPART(YYYY,Album_Date)) AS Year FROM Album_Name GROUP BY DATEPART(YYYY,Album_Date) , Album_ID, Album_Icon
感谢您在这方面的帮助
基于Bagdan回复的解决方案
SELECT *
FROM
(
SELECT x.*,
--ROW_NUMBER() OVER(PARTITION BY x.[Album_Date] ORDER BY x.Album_ID DESC) AS RowNum
ROW_NUMBER() OVER(PARTITION BY DATEPART(YYYY,x.[Album_Date]) ORDER BY x.Album_Date DESC) AS RowNum
FROM Album_Name x
) src
WHERE src.RowNum = 1
编辑#1:
DECLARE @MyTable TABLE
(
Album_ID int,
Album_Name varchar(100),
Album_Description varchar(500),
Album_Date Datetime,
[Year] smallint,
Album_Icon varchar(60)
);
INSERT @MyTable (Album_ID, Album_Icon, [Year])
SELECT 2 , '53575dd7-9e6a-4230-afe7-eb34a9952ef5.jpg', 2010
UNION ALL SELECT 6 , '41c6cefe-aa9a-40af-86bf-0e78784fc9be.jpg', 2011
UNION ALL SELECT 7 , '20472dc8-abff-4cb1-80a4-ec264a91025e.jpg', 2011
UNION ALL SELECT 9 , 'a2185c73-debf-4058-afee-dc54caf674d2.jpg', 2012
UNION ALL SELECT 10, '3e3de287-b966-40cc-8895-9c9e98f1b23d.jpg', 2012
UNION ALL SELECT 11, 'f0743e3e-26d8-44ea-97ad-a7bd33259550.JPG', 2007
UNION ALL SELECT 12, 'dafd1242-19d6-4f66-8b23-75143f107743.JPG', 2012
UNION ALL SELECT 13, 'd623e134-3d69-4b86-86fe-4c5a2ab89086.JPG', 2012
UNION ALL SELECT 14, '9c6b981e-e696-4c85-be6d-3b04559a6cd4.JPG', 2012
UNION ALL SELECT 15, 'b6b867c0-5478-4503-940c-ce75e863bee8.JPG', 2012
UNION ALL SELECT 16, '3cc0d762-f1e1-425a-8923-0e39b4ed0eca.jpg', 2012;
SELECT *
FROM
(
SELECT x.Album_ID, x.Album_Name, Album_Icon,
ROW_NUMBER() OVER(PARTITION BY x.[Year] ORDER BY x.Album_ID DESC) AS RowNum
-- or ROW_NUMBER() OVER(PARTITION BY x.[Year] ORDER BY x.Album_Date DESC) AS RowNum
FROM @MyTable x
) src
WHERE src.RowNum = 1
当您每年查找一行时,您可以使用max(或min)函数每年获取一个唱片集ID,如下所示-
SELECT Album_ID, Album_Name, Album_Icon, DATEPART(YYYY, Album_Date) AS Year
FROM Album_Name a1
where album_ID = (select max(a2.album_Id)
from album_name a2
where a2.album_year = a1.album_year)
您希望每年返回最小或最大albumid吗。例如,对于2011年,albumid应该是6还是7?是否希望每年显示最新的行?最早的?最高ID?实际上它应该基于日期而不是albumID,因为我们可以在2013年添加2003 album,albumID是自动递增的。您想要哪一行,例如2011年的6行或7行?参考资料:@KnowledgeSeeker:请参见编辑#1我对您的sql做了一些小的更改以使其正常工作,否则它会让我得到所有行。我将用部分工作查询更新我的问题。。谢谢..我对Datepart进行了寻址,因此根据日期部分获得不同的结果。其他方面,我有不同的日期,并且它返回了所有的行…@KnowledgeSeek:此查询每[年]为您提供一行(“我不确定如何修改查询以仅从每年获得一行”)。如果您想要上一张专辑(去年-上一张专辑),那么您可以通过删除分区。。即使在给定的有问题的行中,此查询也只会返回album_ID在2,7,11,16中的行,这是您所需要的,对吗?可能是我一定犯了一些错误。。。但我仍然需要在日期字段而不是albumid上对其进行排序。。
SELECT Album_ID, Album_Name, Album_Icon, DATEPART(YYYY, Album_Date) AS Year
FROM Album_Name a1
where album_ID = (select max(a2.album_Id)
from album_name a2
where a2.album_year = a1.album_year)