2013-04-11 38 views
1
id | name | value | time | 
-------------------------- 
1 | A | 1 | 1 | 
2 | B | 2 | 2 | 
3 | C | 2 | 3 | 
4 | A | 3 | 3 | 
5 | A | 4 | 2 | 

後和我的預期如下結果:SQL:聚集一()ORDER BY和集團通過

name | value | 
-------------- 
A | 3 | 
B | 2 | 
C | 2 | 

的結果顯示名稱和值是最新的時間,而不是用名稱重複。 我嘗試查詢:

SELECT name,First(value) 
FROM 
(SELECT name,value,time 
FROM test 
ORDER BY time DESC 
) 
GROUP BY name; 

但我得到了這樣的結果:

name | value | 
-------------- 
A | 1 | 
B | 2 | 
C | 2 | 

我不明白爲什麼一個值不是3,因爲從子查詢我有一個值是3,4 ,1個。

+0

您使用的是哪種databese系統? – 2013-04-11 08:50:34

+0

現在我在Access上測試。但別擔心。我也會在其他系統上測試。 但我懷疑在我的代碼非常多,爲什麼它不起作用。 我剛剛使用簡單的SQL。 – Plioilq 2013-04-11 09:11:05

回答

0

查詢:

SQLFIDDLEExample

SELECT t.name, 
     (SELECT t1.value 
     FROM test t1 
     WHERE t1.name = t.name 
     ORDER BY t1.time DESC 
     LIMIT 1) AS value 
FROM test t 
GROUP BY t.name 

結果:

| NAME | VALUE | 
---------------- 
| A |  3 | 
| B |  2 | 
| C |  2 | 
+0

你能解釋我爲什麼我的查詢不起作用嗎? – Plioilq 2013-04-11 08:59:08

+0

'First()'函數非常少見,mysql沒有這樣的函數。可能訪問讓你這樣做,因爲他有VBA功能...... – Justin 2013-04-11 12:32:26

0

也可以使用partitionby

;with cte as (
    select id, row_number() over (order by time desc) rn 
    from test 
) 
select * from test 
join cte on test.id = cte.id and rn = 1 

只選擇一個更快的產品