2019-01-07

django 部署上线 uwsgi+nginx+django

安装uwsgi

  • uwsgi是python的一个模块,安装uwsgi只需要pip安装
    pip3 install uwsgi

拷贝django项目到服务器目录

uwsgi --http 192.168.31.38:8080 --file shanwu/wsgi.py --static-map=/static=static

参数说明:

  • –http 这个就和runserver一样指定IP 端口
  • –file 这个文件就里有一个反射,如果你在调用他的时候没有指定Web Server就使用默认的
  • – static 做一个映射,指定静态文件

使用uwsgi配置文件启动django项目

  • 在django项目创建script目录,创建uwsgi.ini文件
# uwsig使用配置文件启动
[uwsgi]
# 项目目录
chdir=/opt/proj/shanwu/
# 指定项目的application
module=shanwu.wsgi:application
# 指定sock的文件路径       
socket=/opt/proj/script/uwsgi.sock
# 进程个数       
workers=5
pidfile=/opt/proj/script/uwsgi.pid
# 指定IP端口       
http=192.168.2.108:8080
# 指定静态文件
static-map=/static=/opt/proj/shanwu/static
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/opt/proj/script/uwsgi.log
  • 配置nginx配置文件nginx.conf
server {
        listen 80;
        server_name 192.168.2.108;
        index index.php index.html;
        location / {
            include    uwsgi_params;
            uwsgi_pass  unix:/opt/proj/script/uwsgi.sock;
            uwsgi_param UWSGI_CHDIR  /opt/proj/shanwu;
            uwsgi_param UWSGI_SCRIPT django_wsgi;
            access_log /etc/nginx/logs/access.log;
            }
        location /static {
          alias /opt/proj/shanwu/static;
        }

    }
<think>嗯,我现在需要解决这个SQL问题,找出人流量连续三天都不少于100的记录。首先,我得仔细理解题目要求。题目中的“高峰”是指前后连续三天,也就是说,某一天的前后两天的人流量都至少是100,或者它本身和前后各一天组成连续三天。或者,可能是指连续的三天中,每一天的人流量都不少于100,那么这三个记录都需要被选出来? 根据常见的类似问题,比如查找连续三天满足条件的记录,通常需要确定哪些记录在连续的三天窗口内都满足条件。比如,如果一个记录的前一天、当天、后一天的人流量都不少于100,那么这个中间的那天可能被视为高峰。但这里题目可能需要找出所有属于至少连续三天中的记录,而不仅仅是中间的那天。 例如,假设连续三天A、B、C的人流量都是>=100,那么这三个记录都应该被选中,因为每个都是连续三天的一部分。这时候,问题就转化为如何找到所有至少存在连续三天的情况中的每个记录。 接下来,我需要考虑如何用SQL来实现这一点。可能的思路是,使用自连接或者窗口函数来处理。例如,对于每个记录,检查它是否属于某个连续三天都满足条件的组。 首先,考虑使用窗口函数。比如,对于每个日期,计算当前行和前两行的visitors_flow是否都>=100,或者当前行和下一行的,或者前一行、当前、后一行。这可能需要不同的窗口范围。 或者,另一种方法是,为每个记录检查它前面两天和后面两天的记录是否存在连续三天的情况。比如,对于某个记录,检查它是否是连续三天中的第一天、第二天或第三天。如果存在这样的情况,则包括该记录。 可能的步骤: 1. 确保数据按日期排序,这里题目提示日期随着id增加而增加,所以id的顺序就是日期的顺序。 2. 对于每个记录,检查是否存在连续三天的情况,其中当前记录是其中的一部分。例如,当前记录的前一天和后一天的visitors_flow是否都不少于100,或者当前记录加上后两天是否满足条件,或者前两天的加上当前是否满足。或者,更一般地说,找到所有连续三个记录,它们的visitors_flow都>=100,然后将这三个记录的id都选出来。 所以,如何找到所有这样的连续三个记录的组合,然后取出其中的所有记录? 可能的SQL方法: 使用自连接,将每个记录与前两条和后两条记录组合,然后检查是否存在连续三天的组合。 例如,假设当前记录的id是t.id,那么可以连接t的前一个和后一个记录,然后检查这三个记录的visitors_flow是否都>=100。 但是,这样的自连接可能会导致重复,比如同一个记录可能属于多个连续三天的组。例如,如果连续四天都满足条件,那么中间的第二天可能属于多个连续三天的情况(比如第1-2-3天,第2-3-4天),这时候每个记录都会被多次选中,但只需要出现一次。 因此,正确的做法可能是,对于每个记录,检查是否存在至少两个相邻的记录(前一个和后一个),使得三个连续的记录都满足条件,或者检查当前记录是否是某个连续三天中的第一天、第二天或第三天。 或者,可以考虑使用窗口函数来计算每个记录的前后各一个记录的visitors_flow,然后判断这三个是否都>=100。例如,使用LAG和LEAD函数来获取前一行和后一行的值。 例如,对于每个记录,获取前一天的visitors_flow,当前的,和后一天的。然后,如果这三个都>=100,那么中间的记录就是高峰的一部分。但这样可能会漏掉连续三天中的第一天或第三天的情况。比如,假设连续三天都是>=100,那么中间的记录的前后都是满足的,所以会被选中,但第一天和第三天可能不满足这种情况,因为他们的前后可能不全满足。比如,对于第一天的记录,前一行可能不存在,后一行可能满足,但第二天的记录是否满足?比如,如果连续三天是1、2、3,那么: 记录2的前后是1和3,都满足>=100,所以记录2会被选中。 记录1的后两个记录是2和3,都满足的话,那么记录1是否是连续三天中的第一天?这时候可能需要不同的判断方式。 或者,可能需要检查每个记录是否是连续三天中的任何一个。例如,如果一个记录的前一天和当天都>=100,或者当天和后一天都>=100,或者前一天、当天、后一天都>=100,那么该记录是否属于某个连续三天的高峰? 这可能比较复杂。例如,如何找到所有属于至少连续三天的记录? 另一种思路是,给每个记录分配一个组,其中连续满足条件的记录属于同一个组,然后统计每个组的长度,找出长度>=3的组,并选择这些组中的所有记录。 例如,使用窗口函数来标识连续满足条件的记录的组。例如,使用类似于“island”问题的解决方法,即找到连续满足条件的区间。 例如,计算一个标志,当visitors_flow>=100时为1,否则为0。然后,使用窗口函数计算一个分组标识,每当遇到0时,分组标识递增。这样,连续的1会被分到同一个组。然后,对于每个组,计算其行数,如果>=3,则这些行都属于连续三天或更长的组,从而被选中。 但是,这样的方法是否能正确找到所有连续三天的情况? 假设有一个组的长度是5,那么这5个记录中的每个都属于至少三个连续记录的一部分。例如,记录1、2、3、4、5都是满足条件的,那么每个记录都是某个连续三天的成员。例如,记录1属于1-2-3,记录2属于1-2-3和2-3-4,记录3属于2-3-4和3-4-5等。所以,这样的组的长度>=3时,其中的每个记录都属于某个连续三天的组,因此都应该被选中。 因此,正确的做法可能是: 1. 找出所有连续的visitors_flow>=100的记录组,每个组的长度>=3,然后选择这些组中的所有记录。 所以,如何用SQL实现这个? 步骤: a. 标记每条记录是否满足visitors_flow >=100,例如,生成一个列is_valid(1或0)。 b. 计算每个连续is_valid=1的组的起始点。这可以通过比较当前行与前一行的是否连续,例如,使用ROW_NUMBER()或者LAG函数来生成一个分组标识。 例如,使用以下方法生成组标识: 对于每条记录,如果当前is_valid=1,则计算行号减去按日期排序的行号,其中只考虑is_valid=1的记录。这样,连续的记录会有相同的差值,从而形成一个组。 例如,这个方法的思路是: 当按日期排序后,对于每条is_valid=1的记录,计算其行号(比如,原始行号)和另一个行号,即按is_valid=1的条件进行排序的行号。两者的差值将相同的连续记录分组。 例如,对于以下数据: id | date | visitors_flow | is_valid 1 | 2019-01-01 | 58 | 0 2 | 2019-01-02 | 110 | 1 3 | 2019-01-03 | 123 | 1 4 | 2019-01-04 | 67 | 0 5 | 2019-01-05 | 168 | 1 6 | 2019-01-06 | 1352 | 1 7 | 2019-01-07 | 382 | 1 8 | 2019-01-08 | 326 | 1 9 | 2019-01-09 | 99 | 0 这里,连续的is_valid=1的组是: 组1:id=2,3 → 长度2 → 不满足>=3,所以不选。 组2:id=5,6,7,8 → 长度4 → 满足,所以这些记录都需要被选中。 所以,最终结果应该是id5、6、7、8的记录。 现在,如何用SQL生成这样的组? 可以这样做: 首先,筛选出所有is_valid=1的记录,并为它们分配一个递增的行号。然后,计算原始行号(按日期排序的id顺序)与这个递增的行号的差值。如果连续,那么原始行号和递增行号的差值是相同的。 例如,对于组2中的记录: id | date排序后的原始行号(假设按id排序)为5,6,7,8 → 行号假设为5,6,7,8(可能不是,这里需要具体处理)。 但如果我们按日期排序,因为日期随着id增加,所以排序后的行号即为id的顺序。对于is_valid=1的记录,按日期排序后的顺序是2,3,5,6,7,8。他们的行号(按日期排序)为1,2,3,4,5,6。而他们的原始id是2,3,5,6,7,8。 所以,对于每个is_valid=1的记录,计算原始行号(即id)与递增的行号(按日期排序后的行号)的差。例如: id=2:递增行号1 → 2-1=1 id=3:递增行号2 →3-2=1 id=5:递增行号3 →5-3=2 id=6:3+1=4 →6-4=2 id=7:5 →7-5=2 id=8:6 →8-6=2 所以,差值相同的记录属于同一组。组1的差值为1,包括id2和3。组2的差值为2,包括5,6,7,8. 然后,根据这个差值分组,统计每组的记录数。如果记录数>=3,则这些记录都属于符合条件的组。 因此,最终的SQL步骤可能是: 1. 首先,筛选出所有visitors_flow>=100的记录,并计算他们的差值grp。 具体来说: WITH temp AS ( SELECT *, id - ROW_NUMBER() OVER (ORDER BY date) AS grp FROM gymnasium WHERE visitors_flow >= 100 ) 然后,按grp分组,计算每组的记录数: SELECT grp, COUNT(*) as cnt FROM temp GROUP BY grp HAVING COUNT(*) >=3 这将得到满足条件的组。然后,我们需要将这些组的记录与原表连接,以获取所有属于这些组的记录。 最终的查询可能如下: WITH temp AS ( SELECT *, id - ROW_NUMBER() OVER (ORDER BY date) AS grp FROM gymnasium WHERE visitors_flow >= 100 ), groups AS ( SELECT grp FROM temp GROUP BY grp HAVING COUNT(*) >=3 ) SELECT t.id, t.date, t.visitors_flow FROM temp t JOIN groups g ON t.grp = g.grp ORDER BY t.date; 但是,这可能还不够,因为当原表中存在多个满足条件的组,每个组的记录数>=3时,这些都会被选出。 例如,在上述例子中,组grp=2对应的id5、6、7、8,count是4,所以会被选中,这些记录都将被返回。 但是,这个查询是否正确?假设原表中的数据中,存在一个连续四天满足条件的记录,那么它们的grp值相同,count为4,会被选中,所以四个记录都会被返回。这符合题目要求,因为它们都是连续四天中的一部分,每个都属于至少连续三天的情况。 例如,连续四天的记录:5、6、7、8,那么每个记录都属于至少三个连续记录的一部分: 记录5:属于5、6、7 →连续三天 记录6:属于5、6、7、8中的三个连续(比如5-6-7,6-7-8) 同理,每个记录都属于至少三个连续的记录,所以都被选中。 但题目中的高峰定义为“前后连续三天均不少于100”,这是否意味着每个记录必须属于某个连续三个记录中的中间一个?例如,记录必须满足前一个、当前、后一个都>=100? 比如,在连续四天的情况下: 记录5的前一个是4(不满足,因为visitors_flow=67 <100),所以记录5的前一个不满足,那记录5是否属于高峰? 根据题目中的例子,给出的示例数据可能需要具体分析。比如,假设给出的数据中的记录5、6、7、8: 记录5的日期是2019-01-05,visitors_flow=168 >=100 记录6:2019-01-06,1352 >=100 记录7:2019-01-07382 >=100 记录8:2019-01-08,326 >=100 记录9:99 <100. 那么,这四个记录组成连续四天的满足条件。那么,根据前面的方法,这四个记录会被选出。但根据题目的定义,“前后连续三天均不少于100”是否意味着某个记录的前两天、前一天、当天都满足? 或者,题目中的“前后连续三天”可能指的是连续的三天,即某一天的前一天和后一天都满足,或者更长的连续时间段? 这个问题需要明确题目的要求。比如,题目中的高峰记录是指该记录处于至少连续三天的中间,或者该记录属于任何连续三天的部分? 例如,如果记录是连续四天中的第一天,那么它是否属于高峰?例如,记录5是连续四天的第一天,那么它属于三个连续记录(5、6、7)的第一天,此时,它是否满足“前后连续三天”? 可能题目中的“前后连续三天”是指该记录是连续三天中的中间一天,即前一个、当天、后一个都>=100。例如,如果某一天的visitors_flow>=100,并且前一天的也>=100,后一天的也>=100,则这一天才算作高峰。在这种情况下,中间的那天会被选中,而连续四天中的中间两天(比如记录6和7)会被选中两次,而记录5和8可能不会被选中,因为他们的前后是否都满足? 例如,在连续四天的情况下: 记录5的前一天是4(67<100),所以记录5不能满足前一个和后一个都>=100。记录6的前一天是5(满足),后一天是7(满足),所以记录6会被选中。同理,记录7的前后也满足,所以被选中。记录8的后一天是9(99<100),所以记录8不满足。 所以,在这种情况下,只有记录6和7会被选中。 但这样,题目中的“连续三天”可能是指某一天的前后各有一天,组成连续三天,所以中间的记录会被选中。这种情况下,需要找出所有满足当天、前一个、后一个的visitors_flow都>=100的记录。 这可能与之前的理解不同。这取决于题目的具体定义。例如,题目中的“高峰”可能是指某一天是连续三天中的中间一天,所以该天的前一个和后一个都满足条件。或者,是否只要存在连续三天,包括该天,不管该天是第一天、中间还是最后一天,都算作高峰? 例如,假设有连续三天,比如记录A、B、C,那么这三个记录是否都应该被选中?或者只有B被选中? 这需要看题目的具体要求。原题中的描述是“前后连续三天均不少于 100”,可能意味着每个高峰记录必须满足其前一个和后一个都>=100,即它处于中间位置。例如,对于记录B来说,A、B、C三个连续的天数都满足,那么B的前后都满足,所以B会被选中,而A和C可能不会被选中,除非他们也有满足的前后记录。 比如,在连续三天的情况下,只有中间的记录会被选中。而在连续四天的情况下,中间的两天会被选中(例如,记录B、C在四天A、B、C、D中,那么B的前后是A和C,满足;C的前后是 B和 D,满足)。 因此,这种情况下,正确的做法是找出所有满足当前记录的visitors_flow >=100,且前一天和后一天的visitors_flow也 >=100的记录。 这样,每个满足条件的记录都会被选中。例如,在连续四天的情况下,中间的记录(比如记录6、7)会被选中,而记录5和8不会被选中,因为他们的前一天或后一天不满足条件。 回到题目给的例子: 表数据: id | date | visitors_flow 1 |2019-01-01 |58 2 |2019-01-02 |110 3 |2019-01-03 |123 4 |2019-01-04 |67 5 |2019-01-05 |168 6 |2019-01-06 |1352 7 |2019-01-07 |382 8 |2019-01-08 |326 9 |2019-01-09 |99 那么,我们需要找出满足当前记录、前一个记录、后一个记录的visitors_flow都>=100的记录。 查看数据: 记录2(2019-01-02):前一个记录是1(58<100),所以不满足。 记录3:前一个记录是2(>=100),后一个记录是4(67<100),所以不满足。 记录5:前一个记录是4(67<100),所以不满足。 记录6:前一个记录是5(>=100),后一个记录是7(>=100)。所以满足条件,记录6会被选中。 记录7:前一个记录是6(>=100),后一个记录是8(>=100)。所以满足,记录7被选中。 记录8:后一个记录是9(99<100),所以不满足。 所以,最终结果应该是记录6和7的id、date、visitors_flow。 但根据题目中的示例数据,是否存在这样的记录? 例如,记录5的visitors_flow是168 >=100,记录6是1352 >=100,记录7是382 >=100,记录8是326 >=100。所以,记录5、6、7、8这四个连续的记录,每个的visitors_flow都>=100。但是,根据前面的判断方式,只有记录6和7会被选中,因为它们的前后记录都满足条件。 但是,根据题目的问题描述,可能用户希望找出所有属于至少连续三天中的记录,而不仅仅是中间的那一天。例如,在连续四天的情况下,这四个记录是否都应该被选中? 这时候,可能需要重新理解题目中的“高峰”定义。题目中的定义是“前后连续三天均不少于100”,可能指的是某个记录是连续三天中的中间一天,即该天以及前后各一天都满足条件。或者,可能指的是该天属于一个连续的三天周期中的任意一天,而不管它在周期中的位置。 例如,假设连续三天为A、B、C,那么这三个记录中每一个都属于连续三天的一部分,因此都应该被选中。此时,要找出所有这样的记录。 此时,原来的方法(找出连续三个或更多满足条件的记录组,并选出所有记录)是正确的。 回到之前的例子,如果记录5、6、7、8都满足visitors_flow >=100,那么这四个记录组成一个连续四天的组。其中,每个记录都属于至少三个连续记录的一部分。例如,记录5属于5、6、7;记录6属于5、6、7和6、7、8;记录7属于5、6、7、8中的多个组合;记录8属于6、7、8。因此,这四个记录都应该被选中。 那么,如何用SQL实现这一点? 使用之前提到的窗口函数方法,找出所有属于连续三个或更多满足条件的记录组的记录。 此时,对于示例数据中的记录5、6、7、8: 组grp的值是5-3=2,6-4=2,7-5=2,8-6=2。所以,grp=2,count=4,所以这四条记录都会被选中。 而记录2、3的组grp=1,count=2,所以不会被选中。其他记录不满足visitors_flow >=100的条件。 所以,最终结果会是id5、6、7、8。 这与之前根据中间记录得到的结论不同。这取决于题目的定义。 那么,如何确定题目中的“高峰”定义到底是哪一种? 题目中的描述是:“高峰定义为前后连续三天人流量均不少于 100。” 这里的“前后连续三天”可能指的是该天处于连续三天的中间,即该天的前一个和后一个都必须满足条件。例如,比如,某天是第二天,那么第一天、第二天、第三天都必须满足条件。此时,该天(第二天)会被视为高峰记录。 或者,题目可能要求找出所有属于至少连续三天的记录,而不管是否是中间的天数。例如,只要存在连续三天,其中该天是其中任何一天,则该记录被选中。 例如,如果存在连续三天A、B、C,那么这三个记录都会被选中。如果有连续四天,那么四个记录都被选中。 需要仔细审题。题目中的描述是“前后连续三天均不少于 100”,可能指的是某一天的前后两天也满足条件,即该天处于连续三天的中间,所以该天是高峰。比如,假设连续三天为1、2、3,那么记录2会被选中,而记录1和3不会被选中,除非他们也有自己的连续三天。 或者,可能题目中的“前后连续三天”是指某个记录所在的连续三天,无论该记录是其中的第一天、中间还是最后一天。例如,如果记录是某连续三天中的任意一天,则被选中。此时,连续四天的四个记录都会被选中,因为每个记录都属于至少一个连续三天的组。 这需要从题目示例中推断。比如,假设给出的数据中的记录5、6、7、8的visitors_flow都是>=100,那么根据不同的解法,结果不同。 假设使用中间记录的判断方式,那么只有记录6和7会被选中。而如果使用连续三天组的判断方式,那么5、6、7、8都会被选中。 现在,我们需要根据题目给出的示例数据来判断正确的答案。例如,假设数据中的记录5、6、7、8的visitors_flow均>=100: 记录5:168 >=100 记录6:1352 >=100 记录7:382 >=100 记录8:326 >=100 那么,这四个记录是否应该被选中? 如果按照连续三天组的解法,这四个记录会被选中。而按照中间记录的解法,记录6和7会被选中,记录5和8不会。 但题目中的示例数据中的记录6的visitors_flow是1352,记录7是382,记录8是326。这些连续四天的情况,在按照连续三天组的解法中会被选中,而中间记录的解法只有记录6和7被选中。 可能正确的解法需要根据题目的具体要求。例如,如果题目中的“高峰”要求记录属于至少连续三天中的任何一个,那么连续三天或更长的组的每个记录都应该被选中。而如果高峰仅指处于连续三天的中间一天,则只有中间的记录被选中。 现在,回到问题中的示例数据,假设用户提供的例子中的数据: 例如,假设连续三天的高峰记录是5、6、7,那么这三个记录会被选中?或者只有6、7? 可能这个问题需要根据题目的提示中的例子来测试。例如,在给出的表中,假设记录5、6、7、8都是满足条件的: 记录5:前一个记录4的visitors_flow是67 <100,所以按照中间记录的条件,记录5不满足。记录5的后两个记录是6和7,都满足,所以记录5作为连续三天中的第一天,可能不被选中。 记录6的前一个记录5满足,后一个记录7满足,所以满足中间记录的条件,会被选中。 记录7的前一个记录6满足,后一个记录8满足,所以会被选中。 记录8的后一个记录9的visitors_flow是99 <100,所以记录8不满足中间记录的条件。 因此,正确的答案应该是记录6和7。 那么,如何编写SQL来实现这个? 使用LAG和LEAD函数来获取前一个和后一个记录的visitors_flow,并检查是否都>=100。 例如: SELECT id, date, visitors_flow FROM ( SELECT *, LAG(visitors_flow, 1) OVER (ORDER BY date) AS prev_flow, LEAD(visitors_flow, 1) OVER (ORDER BY date) AS next_flow FROM gymnasium ) t WHERE visitors_flow >= 100 AND prev_flow >= 100 AND next_flow >= 100; 这将找出当前记录的visitors_flow >=100,并且前一个和后一个的记录也都 >=100的记录。在这种情况下,只有记录6和7会被选中。 例如,记录6的prev_flow是记录5的168 >=100,next_flow是记录7的382 >=100,所以满足条件。记录7的prev_flow是6的1352 >=100,next_flow是8的326 >=100,所以满足。记录5的prev_flow是4的67 <100,所以不满足。记录8的next_flow是9的99 <100,所以不满足。 因此,这样的查询将返回id6和7。 这符合中间记录的条件。 那么,题目中的“高峰”可能定义为该记录是连续三天的中间一天,即必须前后都有满足条件的记录。此时,正确的SQL查询是使用LAG和LEAD函数。 因此,正确的答案应该是这样的查询。 但需要考虑边界情况,例如,第一天的记录无法有前一个记录,最后一天无法有后一个记录。因此,在查询中,这些记录的prev_flow或next_flow可能为NULL,所以需要处理。例如,用COALESCE函数将NULL视为0或其他不满足条件的值。或者,在WHERE子句中自动排除那些prev_flow或next_flow为NULL的记录。 例如,在示例中,记录2的prev_flow是记录1的58,不满足>=100。所以不会被选中。记录3的next_flow是记录4的67,不满足,所以不会被选中。 综上,正确的查询应该是通过LAG和LEAD获取前后记录的值,并判断是否都>=100。</think>要解决这个问题,我们需要找出体育馆人流量连续三天均不低于100的高峰记录。以下是分步解决方案: --- ### **步骤分析** 1. **理解高峰定义** 高峰定义为某一天的前一天、当天、后一天的人流量均不少于100。因此,需要检查每条记录的**前一条**和**后一条**数据是否满足条件。 2. **使用窗口函数** 通过 `LAG()` 和 `LEAD()` 函数获取当前记录的前一天和后一天的流量值,直接判断是否满足条件。 3. **过滤结果** 筛选出当前记录、前一条记录、后一条记录的流量均≥100的记录。 --- ### **SQL查询语句** ```sql SELECT id, date, visitors_flow FROM ( SELECT *, LAG(visitors_flow, 1) OVER (ORDER BY date) AS prev_flow, LEAD(visitors_flow, 1) OVER (ORDER BY date) AS next_flow FROM gymnasium ) AS t WHERE visitors_flow >= 100 AND prev_flow >= 100 AND next_flow >= 100; ``` --- ### **关键代码解释** 1. **窗口函数 `LAG()` 和 `LEAD()`** - `LAG(visitors_flow, 1)` 获取**前一条**记录的流量值。 - `LEAD(visitors_flow, 1)` 获取**后一条**记录的流量值。 - 按日期排序确保相邻记录的连续性。 2. **过滤条件** - `visitors_flow >= 100`:当前记录流量≥100。 - `prev_flow >= 100`:前一天流量≥100。 - `next_flow >= 100`:后一天流量≥100。 --- ### **示例结果** 对题目给出的数据: | id | date | visitors_flow | |----|------------|---------------| | 5 | 2019-01-05 | 168 | | 6 | 2019-01-06 | 1352 | | 7 | 2019-01-07 | 382 | | 8 | 2019-01-08 | 326 | 实际满足条件的记录为: - **id=6**(前一条5流量168,后一条7流量382) - **id=7**(前一条6流量1352,后一条8流量326) 结果输出: | id | date | visitors_flow | |----|------------|---------------| | 6 | 2019-01-06 | 1352 | | 7 | 2019-01-07 | 382 | --- ### **总结** 通过窗口函数直接判断相邻记录的流量值,能高效筛选出连续三天的高峰记录。此方法避免了复杂的自连接,逻辑清晰且性能良好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值