2013-07-08 14 views
0

如何在不使用子查詢的情況下獲取聚合函數的記錄詳細信息?如何獲得沒有子查詢的集合函數的行的細節?

我有一個數據集如下:

CREATE TABLE SOMEDATA(
id int, 
low int, 
op int, 
yc int, 
tc int, 
volume int, 
Atimestamp time) 

INSERT INTO SOMEDATA VALUES(5631,  5500,  5600, 5680,   5680,  300527,  '13:16:12.462') 
INSERT INTO SOMEDATA VALUES(5631,  5500,  5600, 5680,   5680,  301720,  '13:16:13.304') 
INSERT INTO SOMEDATA VALUES(5631,  5500,  5600, 5680,   5680,  302041,  '13:16:13.306') 
INSERT INTO SOMEDATA VALUES(5631,  5500,  5600, 5680,   5680,  302410,  '13:16:13.682') 
INSERT INTO SOMEDATA VALUES(5631,  5500,  5600, 5680,   5680,  302548,  '13:16:15.818') 
INSERT INTO SOMEDATA VALUES(5632,  5500,  5600, 5680,   5680,  302548,  '13:16:15.818') 

其中我查詢做:

SELECT * FROM SOMEDATA 
INNER JOIN (select max(Atimestamp) as tm,id FROM SOMEDATA group by id) t 
on t.tm = SOMEDATA.Atimestamp AND SOMEDATA.id = t.id 

這似乎是一個糟糕的方式,雖然這樣做(例如,據我瞭解,這查詢鎖定表兩次) - 是否有更好的方法來做到這一點(也許有HAVING)?

+0

可能重複[獲取的聚合列每個組的前1行](http://stackoverflow.com/questions/6841605/get -top-1-row-of-group) – GSerg

+0

你可以使用像ROW_NUMBER這樣的窗口函數,但是如果在性能上有差異,我不認爲你會得到很多。執行計劃的基礎應該是一樣的,你的查詢也很好。 –

+0

@GSerg是的,它是重複的,但鏈接的答案不包含內聯等級函數,這正是我所尋找的。 – Alex

回答

1

你應該可以使用RANK()函數來做到這一點。喜歡的東西:

SELECT id, low, op, yc, tc, volume, Atimestamp 
FROM 
(
    SELECT 
    id, 
    low, 
    op, 
    yc, 
    tc, 
    volume, 
    Atimestamp, 
    RANK() OVER (PARTITION BY id ORDER BY Atimestamp DESC) AS rank 
FROM somedata 
) a 
WHERE a.rnk = 1 
1

請嘗試:

SELECT * FROM(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY Atimestamp DESC) RNum 
    From SOMEDATA 
)x 
WHERE RNum=1 

OR

;WITH x AS(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY Atimestamp DESC) RNum 
    From SOMEDATA 
) 
SELECT * FROM x 
WHERE RNum=1 
0
SELECT id, low, op, yc, tc, max (Atimestamp) 
    FROM SOMEDATA 
    GROUP BY id, low, op, yc, tc 

對於您需要使用GROUP BY的

相關問題