SQL Select строк пропускает дубликаты с прежней строк - PullRequest
0 голосов
/ 18 мая 2018

Довольно нуб к 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

IE отфильтровывает дубликаты только в том случае, если они встречаются друг за другом.

Любые подсказки будут высоко оценены!

Ответы [ 4 ]

0 голосов
/ 18 мая 2018

Это легко сделать с помощью оконных функций:

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;

Выше приведен стандарт SQL ANSI, поддерживаемый всеми современными СУБД.

order by time приводит к выбору первой строки на основевремя.
Если вы хотите выбрать последнее, используйте order by time desc

0 голосов
/ 18 мая 2018

Вы должны использовать правильный инструмент для правильной работы.

Пытаясь решить эту проблему непосредственно в утверждении select, IMO решает не индексировать ваши данные и извлекать их несортированными, а затем сортировать их впоследствии.используя кодБазы данных - это скудные, средние сортировочные машины, если только вы используете правильную индексацию.

И наоборот, ваша проблема не легко решается с помощью SQL, но тривиально с использованием кода.

Делайте свой обычный выбор, порядокВаш выбор по времени.И тогда в вашем коде вы можете сделать что-то вроде:

currentTitle = "";
for (r in rows) {
    if (!currentTitle.equals(r.title)) {
        print r.title;
        currentTitle = r.title;
    }
}
0 голосов
/ 18 мая 2018

Сначала для этого потребуется столбец заказа, который может представлять порядок данных, если это так, затем используйте вместо 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);

Однаконекоторые СУБД не имеют поддержки предложений LIMIT, например, SQL Server, если так, используйте вместо этого предложение TOP.

0 голосов
/ 18 мая 2018

Я предполагаю, что вы используете MYSQL,

. Вы можете сгруппировать строк по заголовку, используя GROUP BY, а затем max(), чтобы получить больше времени.

Я думаю о чем-то вроде этого:

SELECT max(time), title FROM tv_menu GROUP BY title;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...