5

N 個の行の値を比較し、最大値を持つ行のみを返すクエリを作成しようとしています。たとえば、重複していない行を含むテーブルのみを返したいが、最新の日付の行のみを返したい場合 -

key  | name  | value |   date
 1   | frank |  100  | 1/1/2013
 2   | peter |  200  | 2/1/2013
 3   | jonny |  300  | 3/1/2013
 4   | jonny |  300  | 4/1/2013

そしてクエリ:

SELECT key, name, value, MAX(date)
FROM myTable
WHERE key IN (1,2,3,4)

私はこれが戻ってくることを期待していました

key  | name  | value |   date
 1   | frank |  100  | 1/1/2013
 2   | peter |  200  | 2/1/2013
 4   | jonny |  300  | 4/1/2013

GROUP BY の使用方法がわかりません。私の試みには、基本的なものが欠けていると思います。

4

2 に答える 2

10

最新の行のみが必要な場合は、次を使用できます。

SELECT TOP 1 key, name, value, date
FROM myTable
ORDER BY date desc

これにより、そのテーブルで最新の日付を持つ 1 つの行が返されます。

各名前の最新の日付が必要な場合は、group by を使用できます。

SELECT name, max(date)
FROM myTable
WHERE key in(1,2,3,4)
GROUP BY name

Max は集計関数です。集計関数を使用するときはいつでも、集計されていない列を group by 句で指定する必要があります。

したがって、期待される結果に基づいて、おそらくこれが必要になります。

;with namesWithMaxDate as(
 select
   name
  ,max(date) as date
 from
   myTable 
 group by
   name 
 )
 select 
   myTable.[key]
  ,myTable.name
  ,myTable.value
  ,myTable.date
 from myTable
 inner join
 namesWithMaxDate 
 on 
   myTable.name = namesWithMaxDate.name and 
   myTable.date = namesWithMaxDate.date

グループ化に含まれていない列を返す必要があるため、これは少し複雑です。したがって、最終的な結果セットに到達するには 2 つのステートメントが必要です。

最後のオプション: 古き良きサブクエリ。

 select 
   myTable.[key]
  ,myTable.name
  ,myTable.value
  ,myTable.date
 from myTable
  inner join
 (   select
       name
      ,max(date) as date
     from
       myTable 
     group by
       name ) as namesWithMaxDate
 on 
   myTable.name = namesWithMaxDate.name and 
   myTable.date = namesWithMaxDate.date

集約関数についてはこちら。グループ化についてはこちら

于 2013-10-04T02:46:23.537 に答える
3

これを試してください:

SELECT a.key, a.name, a.value, a.date
FROM myTable a 
WHERE a.key IN (1,2,3,4)
and 
a.DATE = (select MAX(date) from myTable b where a.key = b.key)
于 2013-10-08T10:59:08.607 に答える