2016-11-17 51 views
3

在我的SQL-服務器數據庫中有一個表格,其中每天有不同數量的每個時間值(整數形式,例如800 - > 08:00)的條目和一個唯一的ID字段。在單個表格中顯示來自sql while循環的結果

我的表看起來是這樣的:

ID  NTIME AMOUNT 
8426628 828  531.81 
8426629 828  782.61 
8426630 829  183.41 
8426631 829  183.41 
8426632 829  832.41 
8426633 829  32.41 
8426634 830  374.41 
8426635 830  78.41 
8426636 830  628.41 

因此,我想對於每一個不同的時間值最大的ID來獲得行,像這樣:

ID  NTIME AMOUNT 
8426629 828  782.61 
8426633 829  32.41 
8426636 830  628.41 

我曾嘗試以下查詢:

DECLARE @t int=815; 
WHILE @t<=830 
    BEGIN 
    select ID, NTIME, AMOUNT FROM <my_table> WHERE 
     [email protected] and 
     ID = 
      (select max(ID) FROM <my_table> where [email protected]); 
    Set @t = @t + 1; 
    END 

其中提取正確的結果,但每個選擇查詢結果是d被顯示在不同的表中(結果1-1,結果1-2等)。有沒有辦法在單個結果表中獲得結果,最好不要創建臨時表?

回答

1

您可以使用group by和查詢這樣的:

select 
    T1.ID, 
    T1.NTIME, 
    T1.AMOUNT 
from 
(
    select NTIME, max(ID) as ID 
    from <my_table> 
    group by NTIME 
) as T 
left outer join <my_table> as T1 on T1.ID = T.ID and T1.NTIME = T.NTIME 

內部查詢輸出最大ID爲每個不同的NTIME然後再加入回表到拿到AMOUNT這些對ID和n時間

1

這會給你想要的結果

;WITH cte AS 
(
SELECT id,ntime, amount 
row_number() over (partition by ntime order by id desc) seq 
) 

select id,ntime, amount 
from cte 
where seq=1 
+0

正如迂腐澄清:-),這是一種誤解,認爲CTE需要以分號爲前綴。分號實際上終止了前面的語句(在這個例子中沒有這個語句)。另請注意,'row_number()'不是一個排名函數。 'rank()'和'dense_rank()'是。如果你不打電話給那個列,那麼你的數據就不太容易被誤解。像seq或sequence_number可能是一個更好的選擇。 – DatumPoint