比较SQL Server中按产品返回最大版本的多列

比较SQL Server中按产品返回最大版本的多列,sql,tsql,sql-server-2005,Sql,Tsql,Sql Server 2005,使用SQLServer2005,我试图编写一个select语句,该语句将查询下面的数据(18000行),并为每个产品返回一行,以查找最大的产品版本 我认为查询需要反向比较版本,并在到达Major时存储最大的行号,但我不确定 样本数据 Product Date Major Minor Release Fixpack Build ======= ========== ====== ====== ====== ====== ====== Widgets

使用SQLServer2005,我试图编写一个select语句,该语句将查询下面的数据(18000行),并为每个产品返回一行,以查找最大的产品版本

我认为查询需要反向比较版本,并在到达Major时存储最大的行号,但我不确定

样本数据

    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