считать количество циклов SQL-запроса - PullRequest
0 голосов
/ 01 апреля 2019

Я работаю в проекте, и мне нужна помощь для конкретного запроса в SQL (я работаю в SQL Server Management Studio).У меня есть стол;вход таблицы представляет собой журнал местоположения корабля.Я хочу знать, сколько поездок совершает конкретный корабль за определенный промежуток времени.

Таблица имеет следующий формат:


+---------+-------------------+---------+---------------------+
| ID (PK) | Date (dd/mm/yyyy) | Ship ID | Destination ID (FK) |
+---------+-------------------+---------+---------------------+
|       5 | 02-02-2019        |       5 |                   6 |
|       6 | 02-02-2019        |       6 |                   3 |
|       7 | 03-02-2019        |       5 |                   2 |
+---------+-------------------+---------+---------------------+

Назначение таблицы имеет тип атрибута:
1 if является начальной точкой
2 if является точкой доставки.

Я сделал формулу в Excel, которая проверяет, была ли предыдущая точка началом (тип = 1), а текущей точкой является доставка (тип= 2) в этом случае один цикл, я не знаю, как я могу это сделать с помощью SQL-запроса

У вас есть несколько советов для выполнения этого запроса?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Корабль имеет начальную точку.Он отправляется в пункт назначения, затем, возможно, в другие пункты назначения, а затем обратно в свою начальную точку.Один кругЗатем он снова уходит ... пока не вернется снова.Второй круг и т. Д.

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

Таким образом, чтобы увидеть, как часто корабль возвращался в диапазоне дат (т.е. завершил цикл), мы должны посчитать стартовые точки корабля на следующий день после первого дня диапазона дат.

select ship_id, count(*)
from location
where location_date between dateadd(day, 1, @startdate) and @enddate
and destination_id in (select destination_id from destination where type = 1)
group by ship_id;
0 голосов
/ 01 апреля 2019

Мне кажется, что вы действительно хотите сосчитать все случаи, когда назначение имеет тип 1 и где существует другое назначение с типом 1 для того же корабля.

Сначала присоединитесь к пунктам назначения и ограничьте данныедля типа 1 и требуемый период.Для удобства я положил это в CTE.Из этого получаются все записи, где существует предыдущая запись для того же корабля.Сгруппируйте результат по кораблю и получите счет.

Вы должны получить что-то похожее на:

WITH x
AS
(
SELECT t1.id,
       t1.date,
       t1.ship_id,
       t1.destination_id
       FROM table1 t1
            INNER JOIN table2 t2
                       ON t2.id = t1.destination_id
       WHERE t2.type = 1
             AND t1.date >= '2019-01-01'
             AND t1.date < '2020-01-01'
)
SELECT x1.ship_id,
       count(*)
       FROM x x1
       WHERE EXISTS (SELECT *
                            FROM x x2
                            WHERE x2.ship_id = x1.ship_id
                                  AND (x2.date < x1.date
                                        OR x2.date = x1.date
                                           AND x2.id < x1.id))
       GROUP BY x1.ship_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...