1

SQL Server 2005を使用して、以下のデータ(18000行)をクエリし、製品ごとに1行を返し、最大の製品バージョンを見つけるselectステートメントを作成しようとしています。

クエリはバージョンを逆に比較し、メジャーに到達するときに最大の行番号を格納する必要があると思いますが、よくわかりません。

サンプルデータ

    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

または、さらに良いことに、バージョンを1つの列に組み合わせることができます。

    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
4

2 に答える 2

2

これはうまくいくはずです:

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 

結果

| | 製品 | 医学博士 | メジャー | マイナー | リリース | フィックスパック | ビルド |
-------------------------------------------------- ------------------
| | ウィジェット | 2012-01-01 | 10 | 1 | 0 | 345 | 132 |
| | タイヤ | 2000-04-24 | 8 | 3 | 456 | 3 | 984 |
| | 歯車 | 2012-12-12 | 10 | 0 | 0 | 5 | 548 |

さらに良い方法

SELECT a.product, 
       a.md                          AS date, 
       Cast(b.major AS VARCHAR(5)) + '.' 
       + Cast(b.minor AS VARCHAR(5)) + '.' 
       + Cast(b.release AS VARCHAR(5)) + '.' 
       + Cast(b.fixpack AS VARCHAR(5)) + '.' 
       + Cast(b.build AS VARCHAR(5)) AS version 
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 
| | 製品 | 日付 | バージョン |
----------------------------------------------
| | ウィジェット | 2012-01-01 | 10.1.0.345.132 |
| | タイヤ | 2000-04-24 | 8.3.456.3.984 |
| | 歯車 | 2012-12-12 | 10.0.0.5.548 |
于 2013-01-25T02:51:42.833 に答える
0

派生テーブルでROW_NUMBER関数を使用できます。パーティションをオンにして、バージョン情報Productで並べ替えます。Date desc

注文者Date 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 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

SQL フィドル

于 2013-01-25T06:39:23.460 に答える