Сколько строк между строками sql
Оператор TOP позволяет выбрать определенное количество строк из таблицы:
SELECT TOP 4 ProductName FROM Products
Дополнительный оператор PERCENT позволяет выбрать процентное количество строк из таблицы. Например, выберем 75% строк:
SELECT TOP 75 PERCENT ProductName FROM Products
OFFSET и FETCH
Оператор TOP позволяет извлечь определенное количество строк, начиная с начала таблицы. Для извлечения набора строк из любого места, применяются операторы OFFSET и FETCH . Важно, что эти операторы применяются только в отсортированном наборе данных после выражения ORDER BY.
ORDER BY выражение OFFSET смещение_относительно_начала[FETCH
количество_извлекаемых_строк ONLY]
Например, выберем все строки, начиная с третьей:
SELECT * FROM Products ORDER BY Id OFFSET 2 ROWS;
Число после ключевого слова OFFSET указывает, сколько строк необходимо пропустить.

Теперь выберем только три строки, начиная с третьей:
SELECT * FROM Products ORDER BY Id OFFSET 2 ROWS FETCH NEXT 3 ROWS ONLY;
После оператора FETCH указывается ключевое слово FIRST или NEXT (какое именно в данном случае не имеет значения) и затем указывается количество строк, которое надо получить.

Данная комбинация операторов, как правило, используется для постраничной навигации, когда необходимо получить определенную страницу с данными.
Как посчитать разницу в строках
Вопрос у меня следующий. Как мне найти разницу между этими временами (datediff)? Если бы записи было 2 можно было бы вывести в одну строку как max и min время, но так как этих записей может быть гораздо больше. Может кто знает, буду благодарен. sql Server 2008 r2 Мне нужно в итоге построить запрос типа case when datediff(mm, time1,time2) < 60 then. Построил свой запрос по вашей подсказке вот что получилось у меня
DECLARE @start_date DATE, @end_date DATE, @equip varchar(4), @shift_ident varchar(2) SET @start_date = '2015-05-27' SET @end_date = '2015-05-27' SET @shift_ident = '1' SET @equip ='0128' ;with cte as (SELECT ROW_NUMBER() over(ORDER BY START_TIMESTAMP) num, EQUIP_IDENT as eq , START_TIMESTAMP as time, count(STATUS_CODE) as Zapravka from EQUIPMENT_STATUS_TRANS WHERE STATUS_CODE = 'O23' AND SHIFT_DATE between @start_date and @end_date AND @shift_ident LIKE '%' + SHIFT_IDENT + '%' AND EQUIP_IDENT = @equip GROUP BY EQUIP_IDENT,START_TIMESTAMP) SELECT est.time, DATEDIFF(mm, est.time,est2.time) as duration from cte est join cte est2 on est.num = est2.num-1
выдает ошибку
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
исправил код. вот результат
2015-05-26 20:31:57.000 0 2015-05-27 06:53:12.000 0
выдает 2 строки и duration = 0 что не так?
Посчитать количество строк с условиям из другой таблицы
Помогите пожалуйста. Есть таблица с Актерами ( name ), с фильмами ( title ), и с информацией о том в каком фильме какой актер играл ( cast_info ). Мне нужно посчитать в скольких фильмах снялся актер. Я пишу
select count(1) FROM from cast_info where person_id=(select id from name where name like ('Depp, Johnny'))
нахожу все фильмы и сериалы где он снимался. А в таблице title есть столбец kind_id которая указывает на то что это — фильм, сериал, тв шоу и т.п. Я хочу поставить условие что бы считались только фильмы, не сериалы и прочее. Это kind_id=1 . Я по разному пробовал, но последнее вот
select count(1) FROM ( select from cast_info c, title t where person_id=(select id from name where name like ('Depp, Johnny')) and t.kind_id=1 ) AS pss
Но считает все строки 565 470 048. Как поставить условие?
Отслеживать
10.5k 14 14 серебряных знаков 38 38 бронзовых знаков
задан 10 мар 2021 в 9:46
33 7 7 бронзовых знаков
Не указано условие соединения таблиц cast_info и title
10 мар 2021 в 10:27
В таблице cast_info есть столбец movie_id и он равен id в таблице title. Самой связи в ER диаграмме нет.
10 мар 2021 в 10:45
Этот факт ( cast_info.movie_id = title.id ) у вас никак не отражен в sql-запросе, Поэтому и получаете больше строк чем нужно
10 мар 2021 в 10:51
Cпасибо, получилось.
10 мар 2021 в 11:02
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Связи между таблицами не прописаны, но если без вложенных запросов, то примерно будет так:
create table actors( actor_id integer, name text ) create table titles( title_id integer, name text, kind_id integer ) create table cast_info( actor_id integer, title_id integer ) insert into actors select 1, 'actor1' insert into actors select 2, 'actor2' insert into actors select 3, 'actor3' insert into titles select 1, 'title1', 1 insert into titles select 2, 'title2', 1 insert into titles select 3, 'title3', 1 insert into titles select 4, 'title4', 2 insert into cast_info select 1, 1 insert into cast_info select 1, 2 insert into cast_info select 1, 4 insert into cast_info select 2, 1 insert into cast_info select 2, 2 select a.actor_id, a.name, count(t.*) from actors a left join cast_info c on c.actor_id = a.actor_id left join titles t on t.title_id = c.title_id where a.name like ('actor1') and t.kind_id = 1 group by a.actor_id, a.name
Оконные функции – то, что должен знать каждый T-SQL программист. Часть 1.
Еще в Microsoft SQL Server 2005 появился интересный функционал – оконные функции. Это функции, которые позволяют осуществлять вычисления в заданном диапазоне строк внутри предложения Select. Для тех, кто не сталкивался с этими функциями возникает вопрос – «Что значит оконные?». Окно – значит набор строк, в рамках которого происходит вычисление. Оконная функция позволяет разбивать весь набор данных на такие окна.
Конечно, все что могут оконные функции возможно реализовать и без них. Однако оконные функции обладают большим преимуществом перед регулярными агрегатными функциями: нет нужды группировать набор данных для расчетов., что позволяет сохранить все строки набора с их уникальными идентификаторами. При этом результаты работы оконных функций просто добавляются к результирующей выборке как еще одно поле.
Основное преимущество использования оконных функций над регулярными агрегатными функциями заключается в следующем: оконные функции не приводят к группированию строк в одну строку вывода, строки сохраняют свои отдельные идентификаторы, а агрегированное значение добавляется к каждой строке.
Окно определяется с помощью инструкции OVER(). Давайте рассмотрим синтаксис этой инструкции:
Оконная функция (столбец для вычислений) OVER ([PARTITION BY столбец для группировки] [ORDER BY столбец для сортировки] [ROWS или RANGE выражение для ограничения строк в пределах группы])
Ассортимент функций мы рассмотрим во второй части статьи. Скажу лишь, что они разделяются на: агрегирующие, ранжирующие, смещения.
Для демонстрации работы оконных функций предлагаю на тестовой таблице:
1 2 3 4 5 6 7
CREATE TABLE ForWindowFunc (ID INT, GroupId INT, Amount INT) GO INSERT INTO ForWindowFunc (ID, GroupId, Amount) VALUES(1, 1, 100), (1, 1, 200), (1, 2, 150), (2, 1, 100), (2, 1, 300), (2, 2, 200), (2, 2, 50), (3, 1, 150), (3, 2, 200), (3, 2, 10);
