IF(called_number=@prev_called_number, @cnt:=@cnt+1, @cnt:=1) AS cnt, @prev_called_number:=called_number是什么意思
时间: 2024-03-19 11:42:58 浏览: 15
这是一种MySQL中的高级用法,主要是为了实现在查询语句中动态计算某些值的功能,这里具体实现了在查询结果中添加一个名为`cnt`的字段,表示主叫号码在扫描时间范围内连续拨打同一被叫号码的次数。
`@prev_called_number`和`@cnt`是MySQL中的用户变量,它们的值可以在查询语句中被修改和使用。`@prev_called_number`用于保存上一个被叫号码,`@cnt`用于保存主叫号码连续拨打当前被叫号码的次数。当查询遍历到一个新的记录时,会先判断当前被叫号码是否和上一个记录的被叫号码相同,如果相同,则将`@cnt`加1,否则将`@cnt`重置为1。然后再将`@prev_called_number`更新为当前被叫号码。这样就可以动态地计算出主叫号码在扫描时间范围内连续拨打同一被叫号码的次数。
在本例中,这段代码被用在一个子查询中,目的是筛选出被叫号码被拨打次数大于等于5次的记录,从而触发监控规则1。
相关问题
SELECT caller_number, called_number FROM ( SELECT caller_number, called_number, call_start_time, IF(called_number=@prev_called_number, @cnt:=@cnt+1, @cnt:=1) AS cnt, @prev_called_number:=called_number FROM call_records, (SELECT @prev_called_number:=NULL, @cnt:=1) AS vars WHERE call_start_time >= DATE_SUB(NOW(), INTERVAL 2 HOUR) AND caller_number NOT LIKE '0%' ORDER BY called_number, call_start_time ) AS t WHERE cnt >= 5
这是一个MySQL查询语句,它的作用是查询当前时间到前两小时的话单数据,然后统计同一个被叫号码总共被拨打的次数,如果超过5次,则认为异常,最后返回拨打号码和被叫号码。
具体的查询逻辑如下:
1. 查询话单表中,通话开始时间在当前时间到前两小时之间的记录。
```sql
WHERE call_start_time >= DATE_SUB(NOW(), INTERVAL 2 HOUR)
```
2. 排除掉拨打号码以0开头的记录。
```sql
AND caller_number NOT LIKE '0%'
```
3. 对查询结果按照被叫号码和通话开始时间进行排序,并使用MySQL的变量和IF函数,统计每个被叫号码被拨打的次数。
```sql
SELECT caller_number, called_number, call_start_time,
IF(called_number=@prev_called_number, @cnt:=@cnt+1, @cnt:=1) AS cnt,
@prev_called_number:=called_number
FROM call_records, (SELECT @prev_called_number:=NULL, @cnt:=1) AS vars
WHERE call_start_time >= DATE_SUB(NOW(), INTERVAL 2 HOUR)
AND caller_number NOT LIKE '0%'
ORDER BY called_number, call_start_time
```
4. 最后将统计结果作为子查询,筛选出被拨打次数超过5次的记录,并返回拨打号码和被叫号码。
```sql
SELECT caller_number, called_number
FROM (
SELECT caller_number, called_number, call_start_time,
IF(called_number=@prev_called_number, @cnt:=@cnt+1, @cnt:=1) AS cnt,
@prev_called_number:=called_number
FROM call_records, (SELECT @prev_called_number:=NULL, @cnt:=1) AS vars
WHERE call_start_time >= DATE_SUB(NOW(), INTERVAL 2 HOUR)
AND caller_number NOT LIKE '0%'
ORDER BY called_number, call_start_time
) AS t
WHERE cnt >= 5
```
注意:这个SQL查询语句只实现了被拨打次数超过5次的监控规则,还需要结合其他查询和处理,才能实现完整的异常监控。
module flowing_led2(clk, rst, led,change,star); input clk; input rst; input change,star; output [7 : 0] led; parameter WIDTH =27; parameter COUNT = 9_999_999; reg [WIDTH - 1 : 0] cnt; reg [7 : 0] light; reg flag; reg change; always @(posedge clk) begin if (!rst) cnt <= 0; else if (cnt == COUNT) cnt <= 0; else begin if(star) cnt <= cnt ; else cnt <= cnt + 1 ; end end always @(posedge clk) begin if (light == 8'h01) flag <= 1; //left move else if (light == 8'h80) flag <= 0; //rihgt move else begin if (change && !change_prev) begin change_prev = change; flag = !flag; end else begin change_prev = change; flag = flag; end end end always @(posedge clk) begin if (!rst) light <= 8'h01; else if (cnt == COUNT) begin if (flag) light <= light << 1; else light <= light >> 1; end else ; end assign led = light; endmodule
这是一个 Verilog HDL 语言编写的模块,主要实现的功能是让 LED 灯不断流动。以下是代码的逐行翻译:
- module flowing_led2(clk, rst, led,change,star);:声明一个模块名为 flowing_led2,该模块有五个输入输出端口分别为 clk、rst、led、change 和 star。
- input clk;:声明一个输入端口 clk,用于接收时钟信号。
- input rst;:声明一个输入端口 rst,用于接收复位信号。
- input change,star;:声明两个输入端口 change 和 star,用于接收控制信号。
- output [7 : 0] led;:声明一个 8 位输出端口 led,用于控制 LED 灯的亮灭。
- parameter WIDTH =27;:声明一个宽度参数 WIDTH,其默认值为 27。
- parameter COUNT = 9_999_999;:声明一个计数参数 COUNT,其默认值为 9,999,999。
- reg [WIDTH - 1 : 0] cnt;:声明一个宽度为 WIDTH 的寄存器 cnt。
- reg [7 : 0] light;:声明一个 8 位寄存器 light。
- reg flag;:声明一个寄存器 flag,用于控制灯光流动方向。
- reg change;:声明一个寄存器 change,用于存储控制信号 change 的值。
- always @(posedge clk):在时钟的上升沿触发以下操作。
- begin:起始标记。
- if (!rst):如果复位信号 rst 为零,则执行以下操作。
- cnt <= 0;:将计数寄存器 cnt 的值设置为零。
- else if (cnt == COUNT):否则,如果计数寄存器 cnt 的值等于计数参数 COUNT,则执行以下操作。
- cnt <= 0;:将计数寄存器 cnt 的值设置为零。
- else:否则,执行以下操作。
- if(star):如果控制信号 star 为 1,则执行以下操作。
- cnt <= cnt ;:计数器不做改变。
- else:否则,执行以下操作。
- cnt <= cnt + 1 ;:计数器的值加 1。
- end:结束标记。
- always @(posedge clk):在时钟的上升沿触发以下操作。
- begin:起始标记。
- if (light == 8'h01):如果灯的状态为 0000 0001,则执行以下操作。
- flag <= 1;:将 flag 设置为 1,表示灯光向左流动。
- else if (light == 8'h80):否则,如果灯的状态为 1000 0000,则执行以下操作。
- flag <= 0;:将 flag 设置为 0,表示灯光向右流动。
- else:否则,执行以下操作。
- if (change && !change_prev):如果控制信号 change 为 1 且上一次的控制信号为 0,则执行以下操作。
- change_prev = change;:将上一次的控制信号设置为当前的控制信号。
- flag = !flag;:将 flag 取反,改变灯光流动方向。
- else:否则,执行以下操作。
- change_prev = change;:将上一次的控制信号设置为当前的控制信号。
- flag = flag;:灯光流动方向不变。
- end:结束标记。
- always @(posedge clk):在时钟的上升沿触发以下操作。
- begin:起始标记。
- if (!rst):如果复位信号 rst 为零,则执行以下操作。
- light <= 8'h01;:将灯光的状态设置为 0000 0001。
- else if (cnt == COUNT):否则,如果计数寄存器 cnt 的值等于计数参数 COUNT,则执行以下操作。
- begin:起始标记。
- if (flag):如果 flag 为 1,表示灯光向左流动,则执行以下操作。
- light <= light << 1;:将灯光状态左移一位。
- else:否则,执行以下操作。
- light <= light >> 1;:将灯光状态右移一位。
- end:结束标记。
- else:否则,不做任何操作。
- end:结束标记。
- assign led = light;:将灯光状态赋值给输出端口 led。
- endmodule:模块定义结束标记。