2016-03-15 185 views
3

我有一個每秒更新一些值的表。我想檢索每分鐘的最後一個記錄。SQL查詢獲取每分鐘的最後一條記錄

我試過這段代碼,但它是返回所有記錄。

SELECT 
    t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus 
FROM 
    brands t0 
WHERE 
    t0.cdt BETWEEN '2013-11-15' and '2014-11-15' 
GROUP BY 
    t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus,(datepart(minute, t0.cdt)/1) 

我的表結構是:

ID brandname  cdt       udt brandstatus addedby 
1 khasim 2013-11-01 19:14:18.120 2013-11-15 19:14:18.123 1 1 
2 khasim 2013-11-01 19:14:18.121 2013-11-15 19:14:18.123 1 1 
3 khasim 2013-11-01 19:14:18.122 2013-11-15 19:14:18.123 1 1   
4 khasim 2013-11-01 19:14:18.123 2013-11-15 19:14:18.123 1 1 
5 khasim 2013-11-02 19:17:57.700 2013-11-15 19:17:57.700 1 2 
6 tanveer 2013-11-03 19:18:05.947 2013-11-15 19:18:05.947 1 2 
7 abcdef 2013-11-04 20:50:06.783 2013-11-15 20:50:06.787 1 4 

預期的結果是:

ID brandname  cdt       udt brandstatus addedby 

    4 khasim 2013-11-01 19:14:18.123 2013-11-15 19:14:18.123 1 1 
    5 khasim 2013-11-02 19:17:57.700 2013-11-15 19:17:57.700 1 2 
    6 tanveer 2013-11-03 19:18:05.947 2013-11-15 19:18:05.947 1 2 
    7 abcdef 2013-11-04 20:50:06.783 2013-11-15 20:50:06.787 1 4 

回答

2

使用ROW_NUMBER添加編號方式加上PARTITION BY

WITH Cte AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(
       PARTITION BY brandname, DATEADD(MINUTE, DATEDIFF(MINUTE, 0, cdt), 0) 
       ORDER BY cdt DESC 
      ) 
    FROM tbl 
) 
SELECT 
    ID, brandname, cdt, udt, brandstatus, addedby 
FROM Cte 
WHERE rn = 1 
ORDER BY Id 

氏S:

DATEADD(MINUTE, DATEDIFF(MINUTE, 0, cdt), 0) 

回合下來cdt到其最接近的分鐘,即2013-11-01 19:14:18.1232013-11-01 19:14:00.000

+0

'DATEPART(MINUTE,CDT)'也將獲得細部 –

+0

呀,肯定分鐘的一部分。但是這樣會擾亂分區。我想我已經寫得很差。 –

+0

你的解決方案是我正在尋找的,但是你的意思是搞亂了分區,我把分區改爲cdt(日期時間),並檢查沒有任何問題。我應該在那裏指定「之間」日期 – Tan

3

您可以使用下面的查詢:

SELECT ID, brandname, cdt, udt, brandstatus, addedby 
FROM (
    SELECT ID, brandname, cdt, udt, brandstatus, addedby, 
     ROW_NUMBER() OVER (PARTITION BY brandname, 
             CAST(udt AS DATE), 
             CONVERT(VARCHAR(5), udt, 114) 
          ORDER BY udt DESC) AS rn 
    FROM brands) AS t 
WHERE t.rn = 1 

這一部分:

CONVERT(VARCHAR(5), udt, 114) 

是爲了從udt現場提取小時和分鐘使用。

+0

您能否請您簡單解釋一下,因爲我必須在兩個日期之間每隔一小時,每一天,每一分鐘進行相同的操作,並且您正在執行分區通過品牌名稱,我們可以通過cdt(日期時間) – Tan

+1

@Tan'ROW_NUMBER'應用於具有** **(1)'brandname'的記錄的分區(切片),(2)'來自'udt'的日期' **和**(3)小時,從'udt'分鐘。對於每個這樣的分區,正在挑選最新的記錄。您可以在'cdt'上應用相同的功能。 –

+0

謝謝你的解釋。這非常有幫助。 – Tan

0

試試下面的查詢

SELECT t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus FROM brands t0 WHERE t0.cdt BETWEEN '2013-11-15' and '2014-11-15' 
    and t0.cdt in (select MAX(cdt) from brands group by (CONVERT(CHAR(16),cdt,120))); 
相關問題