2017-04-20 57 views
0

我想第二個條目在SQL我想第二個條目的日期時間明智

Consgno  Name  Entrydatetime 

111   A  01/03/2017 10:10:15 
111   A  01/03/2017 10:20:15 
111   A  01/03/2017 11:10:20 
222   B  02/03/2017 10:10:25 
222   B  02/03/2017 11:10:36 
333   C  06/03/2017 10:10:25 
333   C  07/03/2017 10:10:12 
444   D  04/03/2017 10:10:41 
444   D  04/03/2017 01:10:20 
444   D  06/03/2017 10:10:32 

一個Consgno已進入一個以上的時間。 我想輸出是這樣的:

Consgno Name  Entrydatetime 
    111  A  01/03/2017 10:20:15 
    222  B  02/03/2017 11:10:36 
    333  C  07/03/2017 10:10:12 
    444  D  04/03/2017 01:10:20 
+0

http://stackoverflow.com/questions/tagged/greatest-n-per-group+sql –

+0

標籤您正在使用的數據庫管理系統。當談到日期/時間時,許多產品遠離ANSI SQL兼容。 – jarlh

+0

的可能的複製[SQL服務器:只選擇MAX(DATE)中的行(http://stackoverflow.com/questions/7118170/sql-server-select-only-the-rows-with-maxdate) –

回答

1

的SQL Server/ORACLE/Postgres的:

with CTE as 
(
select MyTable.*, row_number() over(partition by consgno order by entrydatetime) as rn 
from MyTable 
) 
select * 
from CTE 
where rn = 2 
-1

在查詢中使用如偏移命令。

SELECT DISTINCT Consgno,Name,Entrydatetime FROM tbl_test ORDER BY 
    Consgno 
LIMIT 1 OFFSET 1; 

本示例選擇第2行。 的Consgno必須是DISTINCT

+0

當然,你需要'Entrydatetime'加入到'爲了by'? – JohnHC

+0

也可以工作。 –

+0

爲什麼'LIMIT 1'時選擇DISTINCT? (順便說一句,你確定OP是使用支持該廠商特定的'LIMIT'的dbms?) – jarlh

-2

你可以參考我的查詢。希望能夠幫助,我的朋友:))

With CTE 
AS 
(
select *, ROW_NUMBER() over (partition by Consgno order by Consgno) as Number 
from Test) 

select * from CTE where Number = 2 
+0

錯誤'爲了by'基於預期輸出 – JohnHC

+0

@JohnHC:我已經測試過,並如預期返回的輸出,我的朋友! – Tomato32

+0

這一次,是的。在一個較大的數據集上,這並不能保證它將返回OP暗示的第二次發生(按日期)與期望的輸出 – JohnHC

1

(僅適用,如果你DB支持窗口解析函數)

在情況下,如果有機會,可以Entrydatetime重複相同Consgno,並且希望第二date-time wise,那麼你可以使用:

select * from (
    select MyTable.*, 
    dense_rank() over(partition by consgno order by entrydatetime) as rnk, 
    row_number() over(partition by consgno,entrydatetime order by entrydatetime) as rn 
    from MyTable 
) t 
where rnk = 2 and rn = 1 

(請注意,如果consgno有相同Entrydatetime的每一行,此查詢不返回consgno在所有。)

相關問題