2017-05-16 95 views
-2

一個記錄我還沒有想出如何分組按日期每個月獲得一個1紀錄,這是我的查詢:返回每月

select Date, weight 
    from Usrs 
where usr = b 
order by month 

將返回:

user b 
date  weight 
15/03/2017 18 
15/03/2017 14 
19/02/2017 19 
18/03/2017 9 
22/04/2017 24 
30/04/2017 33 
01/05/2017 15 
03/05/2017 30 

,但我只需要每個月的最後記錄,所以我想要它會是這樣的

date  weight 
15/03/2017 18 
19/02/2017 19 
18/03/2017 9 
30/04/2017 33 
03/05/2017 30 

任何想法我怎麼能實現我的目標?

+2

你有兩行'15/03/2017'你怎麼知道哪一個是最後一個?如果你只有一個日期,那麼你怎麼知道哪一個是最後一個? – ollie

+0

這是sql服務器還是mysql?這些不是同一個數據庫。 – Donnie

+0

我在想使用行號功能,但還沒有工作 – FrankMejia7

回答

1

使用ROW_NUMBER來記錄每個月的記錄並保持最後的日期。

select date, weight 
from 
(
    select 
    date, weight, 
    row_number() over (partition by year(date), month(date) order by date desc) as rn 
    from Usrs 
    where usr = 'b' 
) numbered 
where rn = 1 
order by date; 

這是標準SQL,適用於SQL Server。但它在MySQL中不起作用,因爲MySQL不具有窗口函數,如ROW_NUMBER。您可以使用變量在MySQL中模擬ROW_NUMBER。查看它;你會發現很多關於這個問題的答案。

另一個選項是選擇每月最大日期,然後選擇根據記錄:

select date, weight 
from usrs 
where usr = 'b' 
and date in 
(
    select max(date) 
    from usrs 
    where usr = 'b' 
    group by year(date), month(date) 
); 

這又是標準的SQL和SQL Server和MySQL的工作中。這裏的表格必須讀兩遍,所以ROW_NUMBER方法通常是首選。

+0

謝謝你的工作完美! – FrankMejia7