ABAP 新语法--Open SQL

news2024/11/26 4:45:18

1. 常量

1.1 常量赋值

常量字段可以用来为内表中的部分字段赋初始值,字段类型和长度依据输入常量的值决定

  SELECT
    mara~matnr, " 物料号
    mara~matkl, " 物料组
    mara~mtart, " 物料类型
    ' ' AS lkenz, " 删除标识,常量空字符串
    123 AS flag   " 常量数字
  FROM mara
  INTO TABLE @DATA(lt_mara)
  UP TO 100 ROWS.

  cl_demo_output=>display( lt_mara ).

像上面的删除标识字段就蛮有用的,循环内表有时候需要根据复杂的条件决定该行目是否需要,此时若不需要就打上删除标记’X’,最后再用 delete {table} where lkenz = ‘X’ 一次性删除

2. 宿主变量/表达式

2.1 作为SQL操作数

通常在查询语句中,程序声明(非数据库层级)的变量前需要使用转义符 @ 进行标识,这些宿主变量通常被用作 Open SQL 语句中的操作数
在查询语句内部声明结构/内表时,应该在 DATA 前使用转义符
此外,在使用宿主表达式(在 Open SQL 中作为操作数使用的一些表达式) 时,也需要添加转义字符,如下例所示

注:表达式内部的变量不需要再使用转义符,且不能使用表达式外部的数据库对象

  DATA: lv_maktx TYPE makt-maktx VALUE '物料描述'.

  SELECT
    mara~matnr, " 物料号
    mara~matkl, " 物料组
    mara~mtart, " 物料类型
    @lv_maktx AS maktx, " 物料描述    宿主变量
    @( COND char10( WHEN sy-langu = '1' THEN '中文'
                    WHEN sy-langu = 'E' THEN 'English'
                    ELSE                     '其他语言' ) ) AS langu    " 物料语言    宿主表达式
  FROM mara
  INTO TABLE @DATA(lt_mara)
  UP TO 100 ROWS.

  cl_demo_output=>display( lt_mara ).

3. 聚合表达式

3.1 对一组数据计算

聚合表达式用于对一组值执行计算并返回单一的值,可以使用在SELECT或HAVING子句中,不能用在WHERE子句
WHERE 子句的搜索条件在进行分组操作之前应用;而 HAVING 的搜索条件则在进行分组操作之后应用
常见的聚合表达式如下,表达式内部可选用DISTINCT对数据去重后再进行处理:

  • AVG:返回结果集的平均值,返回类型默认为浮点型,可通过AS语句返回指定类型,如DEC,CURR,QUAN或FLTP
  • MAX:返回结果集的最大值
  • MIN:返回结果集的最小值
  • SUM:返回结果集的汇总值
  • COUNT:返回结果集的条目数,通常情况下使用COUNT( * ) / COUNT(*),需要使用DISTINCT时则要指定字段名
  SELECT
    vbeln, 													 " 交货单号
    MAX( lfimg ) AS max_lfimg,                               " 最大交货数量
    MIN( lfimg ) AS min_lfimg,                               " 最小交货数量
    AVG( lfimg AS DEC( 14,3 ) ) AS avg_lfimg,                " 平均交货数量
    SUM( lfimg ) AS sum_lfimg,                               " 总交货数量
    COUNT(*)     AS count_lfimg,                             " 总行目数
    AVG( DISTINCT lfimg AS DEC( 14,3 ) ) AS avg_dstct_lfimg, " 去重交货数量
    SUM( DISTINCT lfimg ) AS sum_dstct_lfimg,                " 去重总交货数量
    COUNT( DISTINCT lfimg ) AS count_dstct_lfimg			 " 去重总行目数
  FROM lips ##DB_FEATURE_MODE[TABLE_LEN_MAX1]
  WHERE
    vbeln BETWEEN '8000000061' AND '8000000069'
  GROUP BY vbeln
  INTO TABLE @DATA(lt_data).
  SORT lt_data BY vbeln.

4. 嵌入表达式

4.1 数值

在 SELECT LIST 使用内嵌表达式来处理数值,使用时需注意传入参数的类型
常见的数值表达式如下:

  • ABS:获取绝对值
  • CEIL:向上取整
  • FLOOR:向下取整
  • DIV:除法计算,取整数位
  • DIVISION:除法计算,保留 N 位小数
  • MOD:除法计算,取余数
  • ROUND:计算舍入值
  DATA(lv_num) = CONV lfimg( '-123.456' ).

  " 简化测试,全部用宿主变量
  SELECT SINGLE
    @lv_num               AS num          , " 原始值
    ABS( @lv_num )        AS abs_num      , " 绝对值
    CEIL( @lv_num )       AS ceil_num     , " 向上取整
    FLOOR( @lv_num )      AS floor_num    , " 向下取整
    DIV( 5 , 2 )          AS div_num      , " 除法,整数
    DIVISION( 5 , 2 , 2 ) AS divison_num  , " 除法,保留n位小数
    MOD( 5 , 2 )          AS mod_num      , " 取余
    ROUND( @lv_num , 2 )  AS rount_num_po , " 四舍五入,N为正数时,保留小数点后N位
    ROUND( @lv_num , -2 ) AS rount_num_ne   " 四舍五入,N为负数时,保留小数点前N位
  FROM lips ##DB_FEATURE_MODE[TABLE_LEN_MAX1]
  INTO @DATA(ls_data).

在这里插入图片描述

4.2 字符串

在 SELECT LIST 使用内嵌表达式来处理字符串, 通常情况下字符串返回结果不能超过255个字符,如果字符长度异常,语法检查时会有错误提示

  • CONCAT:连接字符串,参数固定为2个,各个表达式之间可以嵌套使用,CONCAT内部也可以使用 &&
  • &&:连接字符串,参数没有个数限制,但不能将其他内嵌表达式当作参数使用,仅作为操作符使用,在非SELECT语句中也可以被使用
  • CONCAT_WITH_SPACE:连接字符串,并用 N 个空格分隔,该表达式结果不能超过1333个字符
  • INSTR:遍历字符串,查找指定字符 s1 并返回第一次出现的位置,没有查到则返回0
  • LEFT/RIGHT:从字符串左/右侧开始取出 N 位字符,忽略前导/尾部的空格
  • LENGTH:计算字符串长度
  SELECT concat( carrid , currcode )                AS concat       ,
         carrid && currcode                         AS concat_sign  ,
         concat_with_space( carrid , currcode , 1 ) AS with_space   ,
         instr( carrid , 'BA' )                     AS instr        ,
         left( carrname , 4 )                       AS left         ,
         right( carrname , 4 )                      AS right        ,
         length( carrname )                         AS length
  FROM scarr
  INTO TABLE @DATA(lt_data)
  UP TO 5 ROWS.
  • LOWER/UPPER:将字符串转换成小写/大写
  • LPAD/RPAD:在字符串左侧/右侧填充指定字符 s1,直到字符串长度为 N,如果初始值长度>=N,则不会填充,但是超过 N 位的字符会被截断
  • LTRIM/RTRIM:从字符串左侧/右侧开始逐个删除指定字符 s1,直到出现其他字符为止,默认会删除尾部的空格
  • REPLACE:将字符串中所有的指定字符 s1 用其他字符 s2 代替
  • SUBSTRING:从字符串第 N 位开始截取长度为 M 的字符,系统会默认检查截取范围是否超出该字段最大长度,以避免造成DUMP
SELECT lower( carrid ) AS lower,
       upper( carrid ) AS upper,
       lpad( carrid , 5 , 'B' ) AS lpad,
       rpad( carrid , 5 , 'B' ) AS rpad,
       ltrim( carrid , 'A' ) AS ltrim,
       rtrim( carrid , 'A' ) AS rtrim,
       replace( carrid , 'A' , '@' ) AS replace,
       substring( carrname , 5 , 10 ) AS substring 
  FROM scarr
  INTO TABLE @DATA(lt_data)
    UP TO 3 ROWS.     

4.3 日期/时间

在 SELECT LIST 使用内嵌表达式来处理日期/时间

  • DATS_IS_VALID/TIMS_IS_VALID:校验日期/时间有效性,有效时返回 1,否则返回 0(时间有效性的函数有报错,可能版本不支持)
  • DATS_DAYS_BETWEEN:计算日期d1和d2相隔的天数
  • DATS_ADD_DAYS:为指定日期加上N天
  • DATS_ADD_MONTHS:为指定日期加上N月
  DATA(lv_date) = CONV datum( '20181022' ).

  SELECT 
    fldate                                 AS original_date,
    dats_is_valid( fldate )                AS valid_date,
*    tims_is_valid( @sy-uzeit )             AS valid_time,
    dats_days_between( fldate , @lv_date ) AS between,
    dats_add_days( fldate , 10 )           AS add_days,
    dats_add_months( fldate , 3 )          AS add_months
  FROM sflight
  INTO TABLE @DATA(lt_data)
  UP TO 3 ROWS.

4.4 时间戳

在 SELECT LIST 使用内嵌表达式来处理时间戳

  • TSTMP_IS_VALID:校验时间戳有效性,有效时返回 1,否则返回 0
  • TSTMP_CURRENT_UTCTIMESTAMP:返回当前时间戳
  • TSTMP_SECONDS_BETWEEN:计算时间戳 t1 和 t2 相隔的秒数,需要用赋值语句进行传参,可以添加相应的错误处理
  • TSTMP_ADD_SECONDS:为指定时间戳加上 N 秒,N 必须为 timestamp 类型
DATA(lv_stamp_now) = CONV timestamp( '20190603133559' ).
DATA(lv_stamp_past) = CONV timestamp( '20190602161408' ).

SELECT tstmp_is_valid( @lv_stamp_now ) AS valid_stamp,
       tstmp_current_utctimestamp( ) AS current_stamp,
       tstmp_seconds_between( tstmp1 = @lv_stamp_past,
                              tstmp2 = @lv_stamp_now,
                              on_error = @sql_tstmp_seconds_between=>set_to_null ) AS between,
       tstmp_add_seconds( tstmp = @lv_stamp_now,
                          seconds = @( CONV timestamp( 999 ) ),
                          on_error = @sql_tstmp_add_seconds=>set_to_null ) AS add_second
  FROM sflight
  INTO TABLE @DATA(lt_data)
    UP TO 1 ROWS.

4.5 时区

ABAP_USER_TIMEZONE:获取用户时区,不传参时默认获取当前用户当前 Client 的时区
ABAP_SYSTEM_TIMEZONE:获取系统时区,不传参时默认获取当前 Client 的时区

SELECT abap_user_timezone( user = @( CONV uname( 'JIANGRE' ) ),
                           client = '130',
                           on_error = @sql_abap_user_timezone=>set_to_null ) AS user_zone,
       abap_system_timezone( client = '130',
                             on_error = @sql_abap_system_timezone=>set_to_null ) AS sys_zone
  FROM sflight
  INTO TABLE @DATA(lt_data)
    UP TO 1 ROWS. 

4.6 日期/时间转换

在 SELECT LIST 使用内嵌表达式来转换日期/时间/时间戳

  • TSTMP_TO_DATS:将时间戳转换成对应时区的日期
  • TSTMP_TO_TIMS:将时间戳转换成对应时区的时间
  • TSTMP_TO_DST:根据时间戳获取对应时区的夏令时标识
  • DATS_TIMS_TO_TSTMP:将日期和时间根据时区转换成时间戳
DATA(lv_stamp) = CONV timestamp( '20190603133559' ).

SELECT tstmp_to_dats( tstmp = @lv_stamp,
                      tzone = @( CONV tznzone( 'CET' ) ) ) AS dats,
       tstmp_to_tims( tstmp = @lv_stamp,
                      tzone = @( CONV tznzone( 'CET' ) ) ) AS tims,
       tstmp_to_dst( tstmp = @lv_stamp,
                     tzone = @( CONV tznzone( 'CET' ) ) ) AS dst,
       dats_tims_to_tstmp( date = @sy-datum,
                           time = @sy-uzeit,
                           tzone = @( CONV tznzone( 'CET' ) ) ) AS tstmp
  FROM sflight
  INTO TABLE @DATA(lt_data)
    UP TO 1 ROWS. 

5. Case

5.1 条件语句

在 SELECT 语句中使用 CASE 作为条件语句,与一般条件判断使用的 CASE 类似,但有所区别
该语句不仅可以用于单值判断,也可以根据复杂条件进行判断;
此外,WHEN OTHERS 不再适用,需要使用 ELSE 代替,语句结束时使用 END,而不是 ENDCASE,且需要定义别名

SELECT CASE currcode
       WHEN 'EUR' THEN carrname
       ELSE url
       END AS case_simple,		" 单值判断

       CASE
       WHEN currcode = 'EUR' THEN url
       WHEN carrname <> ' '  THEN carrname
       ELSE carrid && '@' && currcode
       END AS case_complex	" 复杂条件判断
  FROM scarr
  INTO TABLE @DATA(lt_data)
    UP TO 5 ROWS. 

6. NULL Value

在使用 LEFT / RIGHT OUTER JOIN 关联外表时,如果主表中存在记录,但在外表中没有关联到数据,则外表的这部分字段的值在取数过程中始终为 NULL,在取数完成后传入数据对象时,NULL 会再转换成系统兼容的值,通常为初始值;
NULL 值用于数值计算或是字符串处理时返回结果仍为NULL值,可以在条件语句中用 IS [ NOT ] NULL 判断以及处理

DATA: lr_carrid TYPE RANGE OF s_carr_id.

lr_carrid = VALUE #( sign = 'I' option = 'EQ' ( low = 'AA' )
                                              ( low = 'CO' ) ).
SELECT DISTINCT
       r~carrid,
       CASE
       WHEN t~seatsocc IS NULL THEN 'IS NULL'
       WHEN t~seatsocc IS NOT NULL THEN 'IS NOT NULL'
       END AS field_status
  FROM scarr AS r
  LEFT OUTER JOIN sflight AS t ON t~carrid = r~carrid
  INTO TABLE @DATA(lt_data)
 WHERE r~carrid IN @lr_carrid. 

7. CAST

7.1 类型转换

参照下表进行类型转换
在这里插入图片描述
在这里插入图片描述
摘自谷歌翻译:
使用“x”的组合没有其他需要注意的限制。 以下先决条件适用于其他组合:

  • 对于带“y”的组合,初始长度不能小于目标长度。
  • 对于带有“z”的组合,目标长度必须足以表示源中的值。
  • 对于带有“c”的组合,初始长度和目标长度必须相等。

在不兼容类型的情况下,操作数的内容将转换为目标类型(如果值不合适,则会引发异常)。 如果表达式的操作数具有空值,则表达式的结果也为空值。
看一个实际转换的案例

  DATA(lv_date) = CONV d('20101019').

  " 数据库中是存在有效期自字段小于20101219的汇率的
  " 但是该表中日期不是正常的d类型,所以需要数据转换后才可查询
  " 下述测试无法正常查询出结果
  SELECT
    gdatu,
    ukurs
  FROM tcurr
  WHERE
    gdatu < @lv_date AND
    kurst = 'M'      AND
    fcurr = 'JPY'    AND
    tcurr = 'EUR'
  INTO TABLE @DATA(lt_data).

*  cl_demo_output=>display( lt_data ).

  " 需要将数据库有效期自字段转换为yyyyMMdd的格式再计算
  " 有点怪,为啥不能直接把cast的结果作为where条件查询
  SELECT
    CAST( 
      CAST( ( 99999999 - 
        CAST( ( 
          CAST( gdatu AS NUMC ) ) " char不能直接转int计算,只能转numc
        AS INT4 ) )               " 通过numc转int,参与9999999 - datum的运算
      AS CHAR )                   " int不能直接转dats,先将int转为char
    AS DATS )                     " char转dats
    AS datum,
    ukurs
  FROM tcurr
  WHERE
*    datum < @lv_date AND
    kurst = 'M'      AND
    fcurr = 'JPY'    AND
    tcurr = 'EUR'
  INTO TABLE @DATA(lt_data1).
  " 没办法将cast的结果用于where,所以最后delete不符合条件数据
  " 这个日期字段为啥要搞这么复杂,来个sap大佬解释一下啊
  DELETE lt_data1 WHERE datum < lv_date.
  cl_demo_output=>display( lt_data1 ).

8. 内表

8.1 作为数据源

在 ABAP 7.52 后,支持将内表作为数据源使用
内表作为数据源使用时,需要定义别名并使用转义符@,该用法可以用来代替 FOR ALL ENTRIES IN,但FROM 语句中最多使用一个内表
内表作为数据源参与join,和for all entries in后loop赋值,两种情况做了简单的对照,从结果来看第一种方式效率更低,即使多次测试结果偶尔会有所接近,但效率始终低于第二种方式
虽然说select内表能替代for all entries in,但是测试结果始终比for all 慢一丢丢
(PS. 用起来真的很方便,后面被技术leader提了说效率不高,让别在项目里面使用之后就没用过了)

测试代码如下所示:

  DATA: lv_start TYPE timestampl,
        lv_end   TYPE timestampl,
        lv_res   TYPE timestampl.

  TYPES:BEGIN OF ty_data,
          matnr TYPE mara-matnr,
          spras TYPE makt-spras,
          mtart TYPE mara-mtart,
          matkl TYPE mara-matkl,
          maktx TYPE makt-maktx,
          lkenz TYPE lkenz,
        END OF ty_data.

  DATA: lt_data  TYPE TABLE OF ty_data,
        lt_data1 TYPE TABLE OF ty_data.

  " 取mara主表数据,关联makt取语言码以保证join后续内容一致
  SELECT
    makt~matnr,
    mtart,
    matkl,
    spras
  FROM mara
  LEFT JOIN makt ON mara~matnr = makt~matnr
  INTO CORRESPONDING FIELDS OF TABLE @lt_data.
  SORT lt_data BY matnr.

  " 第一种方式,For All Entries In
  GET TIME STAMP FIELD lv_start.
  SELECT
    matnr,
    spras,
    maktx
  FROM makt
  FOR ALL ENTRIES IN @lt_data
  WHERE
    matnr = @lt_data-matnr AND
    spras = @lt_data-spras
  INTO TABLE @DATA(lt_makt).
  SORT lt_makt BY matnr.

  LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<fs_data>).
    READ TABLE lt_makt INTO DATA(ls_makt) WITH KEY matnr = <fs_data>-matnr BINARY SEARCH.
    IF sy-subrc = 0.
      <fs_data>-maktx = ls_makt-maktx.
    ENDIF.
  ENDLOOP.
  GET TIME STAMP FIELD lv_end.
  lv_res = lv_end - lv_start.

  WRITE / 'FOR ALL ENTRIES IN 方式:' && lv_res.

  " 新建内表分组对照
  lt_data1 = CORRESPONDING #( lt_data
                              EXCEPT
                                maktx ).
  " 第二种方式,SELECT 内表
  GET TIME STAMP FIELD lv_start.
  SELECT
    it~*,
    makt~maktx
  FROM makt
  LEFT JOIN @lt_data1 AS it ON it~matnr = makt~matnr AND it~spras = makt~spras ##ITAB_KEY_IN_SELECT ##DB_FEATURE_MODE[ITABS_IN_FROM_CLAUSE]
  INTO CORRESPONDING FIELDS OF TABLE @lt_data1.
  GET TIME STAMP FIELD lv_end.
  lv_res = lv_end - lv_start.
  WRITE / 'JOIN内表方式:' && lv_res.

在这里插入图片描述

9. JOIN 表达式

在特定的应用场景中,需要使用字符长度不一致的两个字段进行关联时,可以使用相应的表达式处理,但要注意表达式的位置,一般需要放在等式左边,如下例
使用for all entries in之后就无法使用该表达式了,有点鸡肋,因为不是所有时候条件都放在主表里面关联查询的
例:(NAST-OBJKY类型为CHAR30,EKKO-EBELN类型为CHAR10)

SELECT k~ebeln,
       t~kschl
  FROM nast AS t
 INNER JOIN ekko AS k ON left( t~objky, 10 ) = k~ebeln
  INTO TABLE @DATA(lt_data).

10. WHERE 条件

常用的条件语句,整理如下:

  • [ NOT ] IN:除了 SELECT-OPTION,也支持多个自定义或者通过子查询获取的值
  • ANY/SOME/ALL:允许将子查询获取到的结果集作为限制条件使用
  • [ NOT ] BETWEEN … AND …:使用范围条件
  • [ NOT ] LIKE … [ ESCAPE ]:使用模糊查询
  • IS [ NOT ] NULL:判断是否有关联到相应的记录
  • IS [ NOT ] INITIAL:判断是否为空值
  • [ NOT ] EXISTS:根据指定条件到数据库表查询数据,判断查询结果是否存在
SELECT i~*
  FROM scarr AS r
  LEFT OUTER JOIN spfli AS i ON i~carrid = r~carrid
 WHERE i~carrid IN ( 'AA' , 'CO' )
   AND i~carrid IN ( SELECT DISTINCT carrid FROM sflight ) 
   AND i~carrid = ANY ( SELECT DISTINCT carrid FROM sflight )
   AND i~carrid NOT BETWEEN 'BA' AND 'CA'
   AND ( i~carrid LIKE 'A%' OR i~carrid LIKE 'C%' )
   AND r~carrid IS NOT NULL
   AND i~carrid IS NOT INITIAL
   AND EXISTS ( SELECT carrid FROM sflight WHERE carrid = i~carrid )
  INTO TABLE @DATA(lt_data). 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/651595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32 Proteus仿真自动红外避障小车前进后退左右转 -0040

STM32 Proteus仿真自动红外避障小车前进后退左右转 -0040 Proteus仿真小实验&#xff1a; STM32 Proteus仿真自动红外避障小车前进后退左右转 -0040 功能&#xff1a; 硬件组成&#xff1a;STM32F103C LCD1602 L298N电机控制电路2个电机一个左轮一个右轮 2个按键(模拟两个避…

Web安全:bWAPP 靶场搭建.(集成了各种常见漏洞和最新漏洞的开源Web应用程序)

Web安全&#xff1a;bWAPP 靶场搭建. bWAPP是一个集成了了常见漏洞的 web 应用程序&#xff0c;目的是作为漏洞测试的演练场&#xff0c;帮助安全爱好者&#xff0c;开发人员和学生发现和防止Web漏洞。它有超过100个网络漏洞数据&#xff0c;包括所有主要的已知网络漏洞. 目录…

谷粒商城第三天-微服务中基本组件的使用

目录 一、前言 二、学习的内容 一、Nacos的服务注册/发现 1. 导依赖&#xff0c;nacos-discovery java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.cho 2. 在application.yml中声明nacos服务器的ip地址和端口号&…

MySQL常见问题

优化慢查询 慢查询可能出现的情况&#xff1a; 聚合查询多表查询表数据量过大深度分页查询 表象&#xff1a;页面加载过慢&#xff0c;接口压测响应时间过长&#xff08;超过1s&#xff09; 如何定位慢查询&#xff1f; 方案一&#xff1a;开源工具 可以使用相应的调试工具&a…

数据库SQL查询(一)

本文介绍SQL查询&#xff0c;如何在海量数据中筛选想要数据&#xff1b; 数据库管理系统选择&#xff1a;关系型数据库mysql 数据库管理工具选择&#xff1a;navicat 本文中查询语句和查询案例参考自&#xff1a;https://edu.csdn.net/course/detail/27673?ops_request_mis…

管理类联考——英语——趣味篇——背诵单词

考友方法推荐 词根词缀巧记考研英语大纲词汇 ⼀、词根词缀构词法的威⼒ 《考研英语⼤纲》要求考⽣掌握 5500 个词汇及相关词组&#xff0c;我们将这 5500 个单词&#xff0c;分成了三类&#xff0c;通过第⼀类“3450 基础⾼频词汇”的学习&#xff0c;考⽣夯实了基础&#xf…

Fmoc-保护氨基酸合成中的新型底物:Fmoc-Thr(Ac4Manα1-2Ac3Manα)-OH,CAS:482576-73-8

文章关键词&#xff1a;糖化学试剂&#xff0c;多肽合成&#xff0c;Fmoc-保护氨基酸&#xff0c;糖基化修饰一、产品描述&#xff1a; 西安凯新生物科技有限公司供应的​Fmoc-Thr(Ac4Manα1-2Ac3Manα)-OH&#xff0c;多肽固相合成法&#xff0c;基于Fmoc化学合成&#xff0c…

[学习笔记] [机器学习] 12. [下] HMM 隐马尔可夫算法(马尔科夫链、HMM 三类问题、前后后向算法、维特比算法、鲍姆-韦尔奇算法、API 及实例)

5. 维特比算法解码隐藏状态序列 Q Q Q 学习目标&#xff1a; 知道维特比算法解码隐藏状态序列 Q Q Q 在本篇我们会讨论维特比算法解码隐藏状态序列 Q Q Q&#xff0c;即给定模型 λ \lambda λ 和观测序列 O O O&#xff0c;求给定观测序列 O O O 条件下&#xff0c;最…

使用华为云开发者插件一键部署应用到ECS

前言 笔者是一名码龄5年左右的程序员&#xff0c;大学是能源行业&#xff0c;处于对技术&#xff08;碎银几两&#xff09;的热爱&#xff0c;选择投身搬砖之路。从用C语言在控制台打印第一句“Hello World&#xff01;”开始&#xff0c;笔者陆续接触过C/C、Java、Golang、Py…

STM32 Proteus仿真4x4矩阵15位抢答器数码管TM1637显示-0039

STM32 Proteus仿真4x4矩阵15位抢答器数码管TM1637显示-0039 Proteus仿真小实验&#xff1a; STM32 Proteus仿真4x4矩阵15位抢答器数码管TM1637显示-0039 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 TM1637驱动4位数码管4x4矩阵键盘蜂鸣器 1.有一个开启键&am…

【Unity Shader】从入门到着魔(1)基本概念:什么是网格?材质?Shader?

文章目录 一、什么是网格(Mesh)?二、什么是MeshFilter(网格过滤器)?三、什么是MeshRenderer(网格渲染器)?四、什么是材质(Material)?五、什么是Shader(着色器)?一、什么是网格(Mesh)? 如上图,模型的三角形面就叫做网格(Mesh),它的本质是一堆顶点数据的规则…

前端基础知识学习——获取dom对象、获取html属性、获取内容、更改样式、创建dom元素、删除元素、代替元素(十)

<!DOCTYPE html> <html lang"en"><head ><meta charset"utf-8" /><title>这是一首离别信</title><script src"https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script></head&g…

Git 基础知识

看版本 git --version 初始化 git init &#xff08;需要在准备建的仓库的目标文件夹根目录下运行&#xff09; 初始化一个仓库供所有其他人一起使用&#xff0c;平时一般都是建好的&#xff0c;个人克隆拉取这个仓库到本地进行编辑。 初始化会产生一个分支叫 master 初…

vue3创建新项目报错:Cannot find module ‘xxx‘

创建vue3项目&#xff0c;命令&#xff1a; 1. 使用vite创建&#xff1a; npm create vitelatest my-vue-app -- --template vue-ts 2.使用vue官方命令&#xff1a; npm init vuelatest 创建vue3模板学习vue3.3的新语法&#xff0c;创建完成后发现文件很多爆红&#xff1a…

华为虚拟化openEuler release 22.03 (LTS-SP1)安装VMTools

华为虚拟化openEuler release 22.03 (LTS-SP1)安装VMTools 环境 虚拟化平台&#xff1a;华为Fusioncompute 6.5.1.SPH6 X86 虚拟机操作系统&#xff1a;openEuler release 22.03 (LTS-SP1) VMTools版本&#xff1a;vmtools-2.5.0.155.tar.bz2 默认vmtools不支持openEuler rele…

【C/C++练习】合并k个已排序的链表

目录 &#x1f43b;题目描述&#xff1a; &#x1f43b;‍❄️思路一&#xff1a;暴力求解法 &#x1f43c;第一步&#xff1a;确定合并后链表的头节点rhead&#x1f43c;第二步&#xff1a;选择次小的进行尾插&#x1f43c;代码实现&#xff1a; &#x1f43b;‍❄️思路二&a…

《C++继承》

本文主要介绍继承的相关知识 文章目录 思维导图一、继承的概念及定义1.继承的概念2.继承的定义2.1 定义格式2.2 继承关系和访问限定符2.3 继承基类成员访问方式的变化 二、基类和派生类对象的赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成…

Vue中的Ajax 配置代理 slot插槽

4.1.Vue脚手架配置代理 本案例需要下载axios库npm install axios 配置参考文档Vue-Cli devServer.proxy vue.config.js 是一个可选的配置文件&#xff0c;如果项目的 (和 package.json 同级的) 根目录中存在这个文件&#xff0c;那么它会被 vue/cli-service 自动加载。你也可…

【OJ比赛日历】快周末了,不来一场比赛吗? #06.17-06.23 #13场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-06-17&#xff08;周六&#xff09; #2场比赛2023-06-18…

使用matplotlib制作动态图

使用matplotlib制作动态图 一、简介二、模块简介1. **FuncAnimation**类介绍2. 定义动画更新函数 三、使用matplotlib制作动画1.一步法制作动态图片2. 两步法制作动态图片 一、简介 matplotlib(https://matplotlib.org/)是一个著名的python绘图库&#xff0c;由于其灵活强大的…