比较SQL Server中按产品返回最大版本的多列
使用SQLServer2005,我试图编写一个select语句,该语句将查询下面的数据(18000行),并为每个产品返回一行,以查找最大的产品版本 我认为查询需要反向比较版本,并在到达Major时存储最大的行号,但我不确定 样本数据比较SQL Server中按产品返回最大版本的多列,sql,tsql,sql-server-2005,Sql,Tsql,Sql Server 2005,使用SQLServer2005,我试图编写一个select语句,该语句将查询下面的数据(18000行),并为每个产品返回一行,以查找最大的产品版本 我认为查询需要反向比较版本,并在到达Major时存储最大的行号,但我不确定 样本数据 Product Date Major Minor Release Fixpack Build ======= ========== ====== ====== ====== ====== ====== Widgets
Product Date Major Minor Release Fixpack Build
======= ========== ====== ====== ====== ====== ======
Widgets 01/01/2012 10 1 0 345 132
Widgets 04/02/2011 6 6 3 932 245
Widgets 09/01/2010 4 92 345 53 2
Gears 03/17/2011 9 2 3 0 21
Gears 12/12/2012 10 0 0 5 548
Tires 04/24/2000 8 3 456 3 984
Tires 04/12/1993 7 14 45 35 252
预期结果
Product Date Major Minor Release Fixpack Build
======= ========== ====== ====== ====== ====== ======
Widgets 01/01/2012 10 1 0 345 132
Gears 12/12/2012 10 0 0 5 548
Tires 04/24/2000 8 3 456 3 984
甚至更好的是,可以将这些版本合并到一个列中:
Product Date ProductVersion
======= ========== ==================
Widgets 01/01/2012 10.1.0.345.132
Gears 12/12/2012 10.0.0.5.548
Tires 04/24/2000 8.3.456.3.984
这应该起作用:
SELECT a.product,
a.md,
b.major,
b.minor,
b.release,
b.fixpack,
b.build
FROM (SELECT product,
Max(date) AS md
FROM tbl
GROUP BY product) a
JOIN tbl b
ON b.product = a.product
AND b.date = a.md
结果
| PRODUCT | MD | MAJOR | MINOR | RELEASE | FIXPACK | BUILD |
--------------------------------------------------------------------
| Widgets | 2012-01-01 | 10 | 1 | 0 | 345 | 132 |
| Tires | 2000-04-24 | 8 | 3 | 456 | 3 | 984 |
| Gears | 2012-12-12 | 10 | 0 | 0 | 5 | 548 |
|产品|日期|版本|
-----------------------------------------
|Widgets | 2012-01-01 | 10.1.0.345.132|
|轮胎| 2000-04-24 | 8.3.456.3.984|
|Gears | 2012-12-12 | 10.0.0.5.548 |您可以在派生表中使用该函数。对产品
进行分区,并按日期说明
或您的版本信息订购
订购人日期描述
select T.Product,
T.Date,
T.ProductVersion
from (
select Product,
Date,
cast(Major as varchar(5))+'.'+
cast(Minor as varchar(5))+'.'+
cast(Release as varchar(5))+'.'+
cast(Fixpack as varchar(5))+'.'+
cast(Build as varchar(5)) as ProductVersion,
row_number() over(partition by Product order by Date desc) as rn
from YourTable
) as T
where T.rn = 1
订购人ProductVersion desc
select T.Product,
T.Date,
T.ProductVersion
from (
select Product,
Date,
cast(Major as varchar(5))+'.'+
cast(Minor as varchar(5))+'.'+
cast(Release as varchar(5))+'.'+
cast(Fixpack as varchar(5))+'.'+
cast(Build as varchar(5)) as ProductVersion,
row_number() over(partition by Product
order by Major desc,
Minor desc,
Release desc,
Fixpack desc,
Build desc) as rn
from YourTable
) as T
where T.rn = 1
能否显示产品版本表?日期只是日期还是日期时间?如果是datetime,那么我认为您可以为每个具有最新datetime的产品选择最重要的产品。这将确保您将获得每个产品的最新版本。
select T.Product,
T.Date,
T.ProductVersion
from (
select Product,
Date,
cast(Major as varchar(5))+'.'+
cast(Minor as varchar(5))+'.'+
cast(Release as varchar(5))+'.'+
cast(Fixpack as varchar(5))+'.'+
cast(Build as varchar(5)) as ProductVersion,
row_number() over(partition by Product order by Date desc) as rn
from YourTable
) as T
where T.rn = 1
select T.Product,
T.Date,
T.ProductVersion
from (
select Product,
Date,
cast(Major as varchar(5))+'.'+
cast(Minor as varchar(5))+'.'+
cast(Release as varchar(5))+'.'+
cast(Fixpack as varchar(5))+'.'+
cast(Build as varchar(5)) as ProductVersion,
row_number() over(partition by Product
order by Major desc,
Minor desc,
Release desc,
Fixpack desc,
Build desc) as rn
from YourTable
) as T
where T.rn = 1