48

私は周りを検索しましたが、この SQLは、2つの一意の列を持つ最新の日付で行を選択していることがわかりました。これ は、私が望むものに非常に近いですが、機能させることができないようです。

集計関数またはGROUPBY句のいずれにも含まれていないため、選択リストの列'ID'が無効であるというエラーが表示されます。

個別の名前ごとに日付ごとに最新の行が必要です

Select ID,Name,Price,Date
From  table
Group By Name
Order By Date ASC

これが私が欲しいものの例です

テーブル

ID 名前 価格 日にち
0 A 10 2012-05-03
1 B 9 2012-05-02
2 A 8 2012-05-04
3 C 10 2012-05-03
4 B 8 2012-05-01

望ましい結果

ID 名前 価格 日にち
2 A 8 2012-05-04
3 C 10 2012-05-03
1 B 9 2012-05-02

Microsoft SQLServer2008を使用しています

4

4 に答える 4

66
Select ID,Name, Price,Date
From  temp t1
where date = (select max(date) from temp where t1.name =temp.name)
order by date desc

上記のデモを含むSQLフィドルを次に示します。


または、コンラッドが指摘しているように、INNER JOIN(デモ付きの別のSQLフィドル)を使用できます。

SELECT t1.ID, t1.Name, t1.Price, t1.Date 
FROM   temp t1 
INNER JOIN 
(
    SELECT Max(date) date, name
    FROM   temp 
    GROUP BY name 
) AS t2 
    ON t1.name = t2.name
    AND t1.date = t2.date 
ORDER BY date DESC 
于 2012-05-04T16:59:07.923 に答える
20

これを行うにはいくつかの方法があります。これはROW_NUMBERを使用します。名前で分割してから、必要な値を最初の位置に配置する順序で並べ替えるだけです。

WITH cte 
     AS (SELECT Row_number() OVER (partition BY NAME ORDER BY date DESC) RN, 
                id, 
                name, 
                price, 
                date 
         FROM   table1) 
SELECT id, 
       name, 
       price, 
       date 
FROM   cte 
WHERE  rn = 1 

デモ

(partition BY NAME ORDER BY date DESC, ID DESC) おそらく、実際のクエリに日付のタイブレーカーとしてIDを追加する必要があることに注意してください

于 2012-05-04T16:56:52.183 に答える
8
select * from (
    Select
        ID, Name, Price, Date,
        Rank() over (partition by Name order by Date) RankOrder
    From table
) T
where RankOrder = 1
于 2012-05-04T17:01:06.237 に答える
-8

GroupByの代わりにDistinct使用する

Select Distinct ID,Name,Price,Date
From  table
Order By Date ASC

http://technet.microsoft.com/en-us/library/ms187831.aspx

于 2012-05-04T16:58:54.397 に答える