SQL选择使用前一行

时间:2018-05-18 08:08:34

标签: sql sorting

相当于SQL的菜鸟,但这就是我的问题。

尝试创建一个返回电视菜单的查询,包含时间和标题,但不是问题,但是......如果有一个背靠背播放的标题,我只想呈现第一个标题和开始时间。

我当前查询的结果如下所示:

Time   Title
07.00  Program A
07.45  Program B
08.30  Program C
09.00  Program C
10.00  Program D
11.00  Program A
12.00  Program C
12.30  Program E

我想要的结果是:

Time   Title
07.00  Program A
07.45  Program B
08.30  Program C
10.00  Program D
11.00  Program A
12.00  Program C
12.30  Program E

I.E只有在彼此之后发生重复时才会过滤掉重复的内容。

任何提示都会非常感激!

4 个答案:

答案 0 :(得分:0)

首先,这需要排序可以代表您的数据排序的列,如果是,那么请使用而不是TIME列。

例如,我使用了Time

select *  
from(select *, 
            (select title 
             from table
             where time < t.time
             order by time desc
             limit 1) Prevtitle
     from table t
    ) tt
where (Prevtitle is null) or 
      (Prevtitle <> title);

但是,某些 DBMS 没有LIMIT子句支持,如SQL Server,如果是,请改用TOP子句。

答案 1 :(得分:0)

使用窗口函数可以轻松完成:

select time, title
from (
   select time, title, 
          row_number() over (partition by title order by time) as rn
   from the_table
) t 
where rn = 1
order by time, title;

以上是ANSI标准SQL,并得到所有现代DBMS的支持。

order by time会导致根据时间选择第一行。
如果你想选择最后一个,请使用order by time desc

答案 2 :(得分:-1)

我假设你使用MYSQL,

您可以使用GROUP BY按标题排group行,然后使用max()检索greater时间。

我在考虑这样的事情:

SELECT max(time), title FROM tv_menu GROUP BY title;

答案 3 :(得分:-1)

您应该使用正确的工具来完成正确的工作。

尝试在select语句中直接解决这个问题,IMO选择不对您的数据编制索引,并将其解压缩,然后使用代码对其进行排序。如果只使用正确的索引,数据库就是精简的,意味着排序的机器。

反之亦然,使用SQL无法轻松解决您的问题,但使用代码则很容易解决。

按常用选择,按时间排序您的选择。然后在您的代码中,您可以执行以下操作:

sudo tcpdump -i any -A "dst port 62655"