计算周期数SQL查询

时间:2019-04-01 18:43:44

标签: sql sql-server

我正在一个项目中,我需要有关SQL中特定查询的帮助(我正在SQL Server Management Studio中工作)。 我有一张桌子;该表的输入是船舶位置的日志。我想知道特定时间间隔内某艘船的航行次数。

表格的格式如下:

<script>

var originalArray = [
    { sys_id: 1234, type: 'XYZZ' }, 
    { sys_id: 1235, type: 'ABCD' }, 
    { sys_id: 1236, type: 'IJKL' },
    { sys_id: 1237, type: 'WXYZ' }, 
    { sys_id: 1238, type: 'LMNO' }
]

var modifiedArray = [
    { sys_id: 1234, type: 'XYZZ' }, 
    { sys_id: 1235, type: 'ZZAA' },  
    { sys_id: 1236, type: 'ZZZZ' },
    { sys_id: 1252, type: 'AAAA' }
]
</script>

表Destination具有一种类型的属性:
如果是起点,则为1
2如果是交货点。

我在excel中做了一个公式,检查上一个点是否为Start(类型= 1),当前点是否为Delivery(类型= 2),在这种情况下为一个周期,我不知道如何使用SQL查询

您对此查询有一些提示吗?

2 个答案:

答案 0 :(得分:0)

在我看来,您似乎真的想计算目的地为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;

答案 1 :(得分:0)

船有起点。它先到达目的地,然后再到达其他目的地,然后再回到起点。一圈。然后它再次离开...直到再次回来。第二圈,等等。

如果我们查看某个日期范围,则可能是我们在第一天看到了起点,或者船舶已经在航行中,因此我们没有看到它。

因此,为了查看船舶在某个日期范围内(即完成一个周期)返航的频率,我们应该计算该日期范围的第一天之后第二天的出发点。

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;