2015-02-09 28 views
1

什麼是sql查詢刪除除最近兩個組合(channel/cdn/mediaplaylist)的2個記錄以外的所有記錄。sql:刪除每個組合(通道/ cdn/mediaplaylist)中最近2個記錄的所有記錄

例如,我有如下表:

channel  cdn  mediaplaylist  response date 

channel1  cdn1  mediaplaylist1  12   2015-02-09 10:40:00 
channel2  cdn2  mediaplaylist2  19   2015-02-09 10:41:00 
channel3  cdn3  mediaplaylist3  16   2015-02-09 10:42:00 
channel1  cdn1  mediaplaylist1  20   2015-02-09 10:43:00 
channel1  cdn1  mediaplaylist1  57   2015-02-09 10:46:00 
channel2  cdn2  mediaplaylist2  83   2015-02-09 10:47:00  
channel3  cdn3  mediaplaylist3  37   2015-02-09 10:48:00 
channel1  cdn1  mediaplaylist1  43   2015-02-09 10:49:00 
channel1  cdn1  mediaplaylist1  33   2015-02-09 10:50:00 
channel2  cdn2  mediaplaylist2  79   2015-02-09 10:51:00  
channel3  cdn3  mediaplaylist3  19   2015-02-09 10:52:00 
channel1  cdn1  mediaplaylist1  13   2015-02-09 10:53:00 

我希望得到以下結果:

channel  cdn  mediaplaylist  response date 

channel1  cdn1  mediaplaylist1  12   2015-02-09 10:40:00 
channel1  cdn1  mediaplaylist1  20   2015-02-09 10:43:00 
channel2  cdn2  mediaplaylist2  19   2015-02-09 10:41:00 
channel2  cdn2  mediaplaylist2  83   2015-02-09 10:47:00 
channel3  cdn3  mediaplaylist3  16   2015-02-09 10:42:00 
channel3  cdn3  mediaplaylist3  37   2015-02-09 10:48:00 
+2

您正在使用哪些DBMS? Postgres的?甲骨文? – 2015-02-09 13:56:54

+1

你使用的是什麼rdbms? – 2015-02-09 13:56:58

+0

請在12篇文章後學習格式化您的問題。 – 2015-02-09 13:57:38

回答

3

隨着SQL-服務器很容易,只需要使用一個CTE和排名之類的函數ROW_NUMBER

WITH CTE AS 
(
    SELECT RN = ROW_NUMBER() OVER (Partition By channel, cdn, mediaplaylist 
           Order By date DESC), 
      c.* -- select all columns for debugging purposes 
    FROM dbo.Channels c 
) 
DELETE FROM CTE WHERE RN > 2 

我喜歡普通表表達式,因爲它們允許看到世界衛生大會我要刪除。因此您只需將DELETE替換爲SELECT *即可。

+0

你不應該刪除CTE,你應該在使用CTE – 2015-02-09 14:01:58

+1

@MoslemBenDhaou過濾時從表中刪除:這將從表中刪除'Channels'。我從推論中推測出這個表名。如果您在CTE中不使用'JOIN',則可以使用此語法。 – 2015-02-09 14:02:59

+0

請問,是否有可能在php腳本中引入你的sql代碼?我想從MySQL數據庫中得到結果。 – lipdjo 2015-02-09 14:04:39

0

以下查詢列舉了行,你讓他們:

select f.*, 
     (@rn := if(@ccp = concat_ws(':', channel, cdn, mediaplaylist), @rn + 1, 
        if(@ccp := concat_ws(':', channel, cdn, mediaplaylist), 1, 1) 
       ) 
     ) as seqnum 
from following f cross join 
    (select @rn := 0, @ccp := '') vars 
order by channel, cdn, mediaplaylist, date desc; 

你想去的地方seqnum爲1或2

你可以把這個在delete值:

刪除(請選擇f。*, (@rn:= if(@ccp = concat_ws(':',channel,cdn,mediaplaylist),@rn + 1, if(@ccp:= concat_ws(':',channel,cdn,mediaplaylist),1,1) ) )from seqnum from following交叉連接 (select @rn:= 0,@ccp:='由信道,CDN,mediaplaylist,日期降序 )CCP上 = f.channel和ccp.channel = f.cdn和ccp.cdn = f.mediaplaylist cdn.mediaplaylist 「)瓦爾 順序其中SEQNUM < 3;