11

インストールされているソフトウェアのバージョンを一覧表示した表があります。

id  | userid | version | datetime
----+--------+---------+------------------------
111 | 75     | 10075   | 2013-03-12 13:40:58.770
112 | 75     | 10079   | 2013-03-12 13:41:01.583
113 | 78     | 10065   | 2013-03-12 14:18:24.463
114 | 78     | 10079   | 2013-03-12 14:22:20.437
115 | 78     | 10079   | 2013-03-12 14:24:01.830
116 | 78     | 10080   | 2013-03-12 14:24:06.893
117 | 74     | 10080   | 2013-03-12 15:31:42.797
118 | 75     | 10079   | 2013-03-13 07:03:56.157
119 | 75     | 10080   | 2013-03-13 07:05:23.137
120 | 65     | 10080   | 2013-03-13 07:24:33.323
121 | 68     | 10080   | 2013-03-13 08:03:24.247
122 | 71     | 10080   | 2013-03-13 08:20:16.173
123 | 78     | 10080   | 2013-03-13 08:28:25.487
124 | 56     | 10080   | 2013-03-13 08:49:44.503

それぞれの 1 つのレコードのすべてのフィールドを表示したいのですuseridが、最も高いバージョン (バージョンもvarchar) のみを表示したいと思います。

4

7 に答える 7

8

SQL-Server (最小 2005) を使用する場合はCTEROW_NUMBER関数で a を使用できます。for version を使用CASTして正しい順序を取得できます。

WITH cte 
     AS (SELECT id, 
                userid, 
                version, 
                datetime, 
                Row_number() 
                  OVER ( 
                    partition BY userid 
                    ORDER BY Cast(version AS INT) DESC) rn 
         FROM   [dbo].[table]) 
SELECT id, 
       userid, 
       version, 
       datetime 
FROM   cte 
WHERE  rn = 1 
ORDER BY userid

デモ

ROW_NUMBER同じ (トップ) バージョンのユーザーが複数いる場合でも、常に 1 つのレコードを返します。すべての「top-version-user-records」を返したい場合は、に置き換える必要がありROW_NUMBERますDENSE_RANK

于 2013-03-13T09:04:22.760 に答える
7

同点の処理方法を指定していませんが、重複を表示したい場合はこれで完了です。

SELECT a.* FROM MyTable a
LEFT JOIN MyTable b
  ON a.userid=b.userid
 AND CAST(a.version AS INT) < CAST(b.version AS INT)
WHERE b.version IS NULL

でテストする SQLfiddle

重複を排除し、存在する場合は最新のものを選択する場合は、クエリを多少拡張する必要があります。

WITH cte AS (SELECT *, CAST(version AS INT) num_version FROM MyTable)
SELECT a.id, a.userid, a.version, a.datetime 
FROM cte a LEFT JOIN cte b
  ON a.userid=b.userid
 AND (a.num_version < b.num_version OR 
     (a.num_version = b.num_version AND a.[datetime]<b.[datetime]))
WHERE b.version IS NULL

別の SQLfiddle

于 2013-03-13T09:09:15.893 に答える
6
WITH records
AS
(
    SELECT  id, userid, version, datetime,
            ROW_NUMBER() OVER (PARTITION BY userID
                                ORDER BY version DESC) rn
    FROM    tableName
)
SELECT id, userid, version, datetime
FROM    records
WHERE   RN =1 
于 2013-03-13T08:58:53.383 に答える
1

これで問題が解決すると思います:

 SELECT id,
       userid,
       Version,
       datetime FROM (
           SELECT id,
                  userid,
                  Version,
                  datetime , 
                  DENSE_Rank() over (Partition BY id order by datetime asc) AS Rankk
           FROM [dbo].[table]) RS 
WHERE Rankk<2

あなたの要件にRANK関数を使用しました....

于 2013-03-13T09:17:33.033 に答える
0
select l.* from the_table l
left outer join the_table r
on l.userid = r.userid and l.version < r.version
where r.version is null
于 2013-03-13T09:07:12.930 に答える