3

これは SQL Server テーブルのデータです

id   user_id     start_date   status_id    payment_id
======================================================
2      4         20-nov-11         1          5
3      5         23-nov-11         1         245
4      5         25-nov-11         1         128
5      6         20-nov-11         1         223
6      6         25-nov-11         2         542
7      4         29-nov-11         2         123
8      4         05-jan-12         2         875

user_idまた、異なる値を取得する必要がありますが、 start_date が最も高いorder by id ascものだけを取得する必要がありますuser_id

次の出力が必要です。

id   user_id     start_date   status_id    payment_id
======================================================
8      4         05-jan-12         2         875
4      5         25-nov-11         1         128
6      6         25-nov-11         2         542

助けてください!

これに対するSQLクエリは何ですか?

4

2 に答える 2

3

row_number()サブクエリまたは CTE を使用して使用できます。

サブクエリのバージョン:

select id, user_id, start_date, status_id, payment_id
from
(
  select id, user_id, start_date, status_id, payment_id, 
    row_number() over(partition by user_id order by start_date desc) rn
  from yourtable
) src
where rn = 1

デモで SQL Fiddle を参照してください

CTE バージョン:

;with cte as
(
  select id, user_id, start_date, status_id, payment_id, 
    row_number() over(partition by user_id order by start_date desc) rn
  from yourtable
)
select id, user_id, start_date, status_id, payment_id
from cte
where rn = 1

デモで SQL Fiddle を参照してください

または、テーブルをそれ自体に結合できます。

select t1.id, 
  t1.user_id, 
  t1.start_date, 
  t1.status_id, 
  t1.payment_id
from yourtable t1
inner join 
(
  select user_id, max(start_date) start_date
  from yourtable
  group by user_id
) t2
  on t1.user_id = t2.user_id
  and t1.start_date = t2.start_date

デモで SQL Fiddle を参照してください

すべてのクエリで同じ結果が得られます。

| ID | USER_ID |                      START_DATE | STATUS_ID | PAYMENT_ID |
---------------------------------------------------------------------------
|  8 |       4 |  January, 05 2012 00:00:00+0000 |         2 |        875 |
|  4 |       5 | November, 25 2011 00:00:00+0000 |         1 |        128 |
|  6 |       6 | November, 25 2011 00:00:00+0000 |         2 |        542 |
于 2012-11-19T20:48:17.067 に答える
0

最高ではなく、テストされていません:

select *
  from ServersTable 
  join (
    select User_Id, max(Id) as ID
      from ServersTable x
     where x.start_date = (
          select max(start_date)
            from ServersTable y
           where y.UserID = x.UserId
           )
     group by User_Id) s on ServersTable.Id = s.Id
于 2012-11-19T20:53:36.577 に答える