SybaseIQ部署及应用

1 文档内容

前半部分是SYbaseIQ搭建工作,即:在 Virtualbox 上安装 SuSE 系统并搭建 SybaseIQ 16 数据库,开放 4888 端口,然后使用主机上的 ADS 连接;后半部分是SybaseIQ的使用方法介绍,包括数据导入导出、SQL应用等。

2 准备工作

2.1 软件版本

整个过程中所用到的软件和环境的版本信息如下。

软件版本备注
Windows10宿主机
ADS19.0Aqua Data Studio,数据库开发工具
VirtualBox5.2.4虚拟机软件
VirtualBoxExtensionPack5.2.4虚拟机扩展包,用于增强虚拟系统功能
VBoxGuestAdditions5.2.4进行虚拟机和主机之间共享数据及调整屏幕显示
SLES12-SP3SUSE Linux Enterprise Server,SuSE 一个发行版
SybaseIQ16.1Linux64-iq1610sp03_eval
secureCRT服务器远程连接工具

2.2 资料汇总

2.2.1 资源下载

相关的软件和文档等资源,可以在百度网盘下载,提取码为4t3h

2.2.2 参考文章

部署过程中参考的一些文章如下:

3 虚拟机环境配置

3.1 安装 VirtualBox

默认安装即可,略过。

3.2 安装 VirtualBoxExtensionPack

VirtualBoxExtensionPack 可以增强虚拟系统功能。安装方法比较简单,如下图所示,在 VirtualBox 中点击管理,选择全局设定,进入扩展界面,添加 VirtualBoxExtensionPack 扩展包,然后默认安装即可。

图片

3.3 安装 SuSE 系统

在 VirtualBox 中点击新建,按照下图提示创建虚拟机(因为 SybaseIQ 的要求,内存大小最好分配到 4048M 以上)。

图片

创建完成后,需要添加.iso 系统镜像文件来安装 SuSE 系统,添加方式如下图所示。

图片

然后打开 SUSE12,进行系统的安装。如下图所示,选择Installation选项即可。

图片

如下图,语言设置这里根据自己情况选择,注意进行一下键盘测试。

图片

如下图,Registration 这里直接 Skip 即可。

图片

如下图,设置自己的用户名和密码。如果选择Use this password for system administrator选项,就意味着设置此密码为 root 用户的密码。

图片

安装系统过程中如果有报一些包的安装错误,retry 就行了。安装完后,会再次来到主界面,选择Boot from Hard Disk****即可进入系统。

3.4 使用secureCRT 连接虚拟机

虽然打开了虚拟机,但是虚拟机系统自身的 Terminal 是比较难用的,尤其涉及到和主机之间的交互(主机和虚拟机的复制粘贴通常是相互独立的)。而且实际生产场景中,服务器是在机房的,不可能在机房里做太多的操作,所以需要一个远程连接的工具,让我们在自己的电脑上就能访问服务器/虚拟机。secureCRT 就是这样一款可以登陆Linux 服务器的远程连接工具。

3.4.1 配置虚拟机端口转发

在 SuSE 的桌面系统中用鼠标右键,打开一个 Terminal(或者使用快捷Ctrl+Alt+F1打开 tty1)。输入以下命令来查看虚拟机内网 ip,如果要求 root 密码,输入前面操作时设置的 root 密码即可。

sodu ifconfig

图片

可以看到虚拟机的内网 ip 为10.0.2.15,然后按照下图指示,在 VirtualBox 中配置该虚拟机的端口转发规则,以便在主机上进行访问。

图片

3.4.2 关闭虚拟机防火墙

设置完端口转发规则后,还需要关闭掉虚拟机的防火墙,不然宿主机无法访问虚拟机。在 Terminal 中依次执行以下三条命令。

sodu SuSEfirewall2 stop
sudo systemctl stop SuSEfirewall2
sudo systemctl disable SuSEfirewall2

上述命令的作用依次是:关闭防火墙的应用、关闭防火墙服务、关闭开机自动打开防火墙的功能。

3.4.3 配置 secureCRT 连接信息

打开 secureCRT 并新建一个连接,如下图所示,按照配置好的端口转发规则来设置连接信息。

图片

为了方便,可以设自动登录的信息,如下图,添加登陆虚拟机的用户名和密码就可以了。

图片

点击确定,登陆成功。

3.5 配置共享文件夹

为了方便将下载的 SybaeIQ 数据库安装包等文件从宿主机传递到虚拟机上,同时又不占用虚拟机的存储空间,需要设置共享文件夹。共享文件夹设置成功后,宿主机和虚拟机都可以访问该文件夹,从而实现资源共享。

3.5.1 创建共享文件夹

如下图所示,在 VirtualBox 中对虚拟机进行设置,选中宿主机上的文件夹当做是共享文件夹,并记住共享文件夹名称。

图片

3.5.2 安装 VBoxGuestAdditions

VBoxGuestAdditions 具备支持虚拟机和宿主机之间共享数据功能,需要进行安装。该软件可以在官方网站下载,注意选择对应的版本。本文所适配的软件下载地址为VBoxGuestAdditions5.2.4版本

3.5.2.1 安装基础包

在安装 VBoxGuestAdditions 之前还需要对系统环境进行配置,安装一些基础包,执行以下命令按照提示进行操作即可。

sudo zypper install gcc make perl kernel-devel dkms

3.5.2.2 下载 VBoxGuestAdditions 到虚拟机

VBoxGuestAdditions 需要在虚拟机上安装,有两种方法将其移动到虚拟机上。

方法一:下载到宿主机上然后通过挂载 ISO 的方式将其移动到虚拟机上

如下图所示,下载好.iso 文件后,参照添加 SuSE 系统镜像的方法,将其添加到镜像位置。然后在虚拟机中打开 Home 主文件夹,点击.iso 镜像。

图片

按照要求输入密码,即将.iso 镜像可挂载到虚拟机上。

图片

然后可以把该.iso 文件拷贝到虚拟机上,备用。

方法二:直接下载到虚拟机上

运行以下命令,即可下载该.iso 文件到当前目录(注意下载文件的版本)。

wget http://download.virtualbox.org/virtualbox/5.2.4/VBoxGuestAdditions_5.2.4.iso

3.5.2.3 安装 VBoxGuestAdditions

输入以下命令从而解压.iso 文件。

mkdir /mnt/cdrom
mount -o loop VBoxGuestAdditions_5.2.4.iso /mnt/cdrom/

解压后的结果如下图所示。
图片

运行以下命令。

sudo ./VBoxLinuxAdditions.run

图片

按照提示重启虚拟机,安装完成。

3.5.3 挂载宿主机磁盘

由于已经配置好了 secureCRT,能够方便地对虚拟机进行操作,所以以下 linux 命令语句均默认在 secureCRT 中执行。依次执行以下命令,将宿主机上 virtualShare 文件夹挂载到虚拟机的/mnt/data 目录下,实现文件共享。

mkdir /mnt/data
modprobe -a vboxsf vboxguest --allow
mount.vboxsf virtualShare /mnt/data

然后进入到/mnt/data 目录下,能看到宿主机 virtualShare 目录下的文件,说明配置共享文件夹成功。
图片

4 SybaseIQ 安装

4.1 SybaseIQ 安装

因为已经配置过共享文件夹,所以可以将在宿主机上下载好的 SybaseIQ 安装包放进共享文件夹中。在虚拟机中找到该文件并解压,然后运行 setup .bin进行安装,命令如下。

sudo tar -xzvf Linux64-iq1610sp03_eval.tgz
cd Linux64-iq1610sp03_eval
sudo ./setup.bin

安装过程中需要配置的安装路径,就是后续将会用到的 SYBASE,即 SybaseIQ 主目录(我这里想输入的其实是/home/rex/iq,结果手抖输错成了/home/res/iq 不过不影响)。
图片

其余按照提示进行操作即可。

4.2 设置环境变量

执行以下命令。

cd /home/res/iq/IQ-16_1
sudo ./IQ-16_1.sh 

然后打开/etc/profile 文件,在文件末尾添加相关环境变量,内容如下(注意路径):

# set java env ...
export JAVA_HOME=/home/res/iq/jre/bin
export PATH=$JAVA_HOME/bin:$PATH
 
# set iq env ...
export IQBASE=/home/res/iq/IQ-16_1
source $IQBASE/IQ-16_1.sh

改完后保存退出,然后执行以下命令,使之立即生效。

source /etc/profile

修改 hosts 文件,以便 Java 能够准确地找到虚拟机 host。修改方式是进入到/etc/hosts 文件中,将 127.0.0.1 对应的 hostname 修改为虚拟机 hostname,修改后的结果如下。
图片

4.3 探索基础功能

4.3.1 启动 Cockpit Web Console

Cockpit Web Console 可以管理和监视本地系统中的服务,在本例中可以查看、管理 SybaseIQ 数据库服务。执行以下命令,进行启动(COCKPIT_HOME在本例中为/home/res/iq)。

cd $COCKPIT_HOME/COCKPIT-4/bin
./cockpit.sh 

启动后,可以看到控制台的地址如下:
图片

按照前述设置端口转发的方法配置 4283 端口的转发规则,以便在宿主机上访问控制台,配置结果如下图所示。

图片

配置完成后在宿主机浏览器中输入地址 https://127.0.0.1:4283/cockpit,访问控制台,结果如下图所示。

图片

4.3.2 启动 Utility_db 数据库服务

Utility_db 称为实用程序数据库,又称为幻数据库,它没有物理表示没有此数据库的数据库文件,该数据库也不含数据。 该数据库主要用于管理其它数据库。执行以下命令创建 Utility_db 数据库服务(SYBASE在本例中为/home/res/iq)。

cd $SYBASE/IQ-16_1/bin64
./cockpitutildb.sh

在创建幻数据库服务时会要求创建密码,而其账号默认是DBA,具体解释见下图。
图片

启动成功后通过dblocate命令查看创建的数据库服务具体名称,如下图所示。

图片

4.3.3 在控制台中查看 Utility_db 数据库

强制刷新控制台,选择上述 Utility_db 数据库服务,并使用设置的账号密码登陆。

图片

登陆成功后就可以对数据库进行管理了。

图片

5 部署数据库

5.1 创建 dlab 数据库服务

使用dblocate命令查看正在运行的数据库服务,确保 Utility_db 数据库服务在运行中,接下来使用该数据库服务创建 dlab 数据库。首先选择一个目录作为 dlab 数据库的主目录(这里选择/home/res/dlab),并执行以下命令创建相应的文件夹。

mkdir dlab
cd dlab
mkdir sql

创建/home/res/dlab/sql/database.sql 文件,并填入以下内容(注意路径与上述设置对应;本例中的 dlab 数据库管理员账户和密码分别是dlabdlabpwd123):

CREATE DATABASE '/home/res/dlab/dlab.db'
DBA USER 'dlab' DBA PASSWORD 'dlabpwd123'
JCONNECT ON
CASE RESPECT
BLANK PADDING ON
TRANSACTION LOG ON
COLLATION '936ZHO'
PAGE SIZE 4096
IQ PAGE SIZE 131072
IQ PATH '/home/res/dlab/system_main.iq'
IQ RESERVE 200
 
TEMPORARY PATH '/home/res/dlab/system_temp.iqtmp'
TEMPORARY RESERVE 1000
 
MESSAGE PATH '/home/res/dlab/dlab.iqmsg'

创建/home/res/dlab/dlab.cfg 文件,并填入以下内容:

-n DLABNODE_A
-x tcpip{port=4888}
 
-c 48m
-gc 20
-gd all
-gl all
-gm 10
-gp 4096
-ti 4400
 
-iqmc 1024
-iqtc 1024

然后应用 Utility_db 数据库服务来创建 dlab 数据库,需要执行以下命令(注意 Utility_db 在本机上的数据库服务名)。

dbisql -c "uid=DBA;pwd=dlabpwd123;eng=linux-vd38_dlab_cockpit_utility_db;dbn=utility_db" -nogui /home/res/dlab/sql/database.sql

创建成功后,应用以下命令启动 dlab 数据库服务。

start_iq @dlab.cfg dlab.db

结合配置信息并使用 dblocate 查看 dlab 数据库服务的名称,结果如下图所示。
图片

dlab 数据库服务启动成功,后续可进行一些表空间、权限等内容的设置。

5.2 连接数据库服务的N种方式

5.2.1 在 Cockpit 控制台中连接

与上述在 Cockpit 控制台中登录 Utility_db 的方式一样,也可以在控制台中管理 dlab 数据库。

图片

5.2.2 通过dbisql命令连接

使用dbisql命令,可以连接数据库服务。

图片

5.2.3 使用 ADS 连接

在宿主机中连接虚拟机中的 dlab 数据库服务,首先需要在 VirtualBox 中配置端口转发规则。

图片

打开 ADS ,然后选择注册服务器,填入虚拟机中 dlab 的数据库服务信息后,测试连接成功即说明连接成功。

图片

保存以上设置,即可使用 ADS 连接虚拟机上 SybaseIQ 下的 dlab 数据库服务,任务完成。

图片

5.2.4 使用Windows组件Interactive SQL连接

在宿主机上安装与虚拟机中版本相同的SybaseIQ软件,就可以通过其中的Interactive SQL组件来连接虚拟机中的SybaseIQ数据库。如下图所示,填写对应的连接信息即可。

图片

如下图所示,在安装的时候,也可以选择定制安装,然后选择仅安装SAP IQ Client模块进行安装即可。因为在宿主机上安装SybaseIQ的目的是连接虚拟机中的SybaseIQ数据库,所以没有必要安装连接组件以外的模块。

图片

这个Interactive SQL到底是什么东西呢?找到此组件的快捷方式,然后查看其属性发现,该组件指向的是dbisql.exe。

图片

如下图所示,这个dbisql.exe的名称和所在目录与5.2.2节中介绍的虚拟机上的dbisql命令是一致的,猜测二者是对应的,也就是说宿主机上的Interactive SQL组件应该就是对应虚拟机中的dbisql程序。

图片

6 SybaseIQ导入数据

6.1 建表

连接数据库,创建自己(dlabiquser)名下的表时,可省略表名前的用户名。

create table if not exists dlabiquser.branch (
   id smallint NOT NULL PRIMARY KEY,
   prov varchar(20) default '',
   v9 varchar(9) default '',
   a6 varchar(20) default ''
)

6.2 数据准备

为提高效率防止出错,入库前需要对数据进行标准化处理,即三步走:转编码格式、转换行符、追加行尾字段分隔符。原始数据的示例如下:

0|!上海|!243563423|!jfdasd
1|!北京|!098567766|!afsgdf

在Linux和Windows中均可单独完成数据准备的三步操作。

6.2.1 在Linux中完成数据准备

在命令行中按照步骤依次输入命令进行操作。

6.2.1.1 UTF8编码格式转为GBK

iconv branch.csv -f utf-8 -t gb18030 -o branch.csv.step1

图片

6.2.1.2 转换行符

dos2unix -n branch.csv.step1 branch.csv.step2

图片

6.2.1.3 追加行尾字段分隔符

sed 's/$/|!/g' branch.csv.step2 > branch.csv.step3

图片

数据准备工作完成。

6.2.2 在Windows中完成数据准备

在UltraEdit工具中操作。

6.2.2.1 UTF8编码格式转为ASCII

图片

6.2.2.2 DOS文件格式转为UNIX

图片

6.2.2.3 替换原换行符为|!换行符

图片

6.2.3 补充说明

6.2.3.1 转换编码格式为GBK的原因

数据库配置的要求。

6.2.3.2 转换行符

  • 转换行符的原因:

导入数据的时候需要指定行分隔符,例如:

ROW DELIMITED BY '\x0a'

但是Linux和Windows的换行符不同,所以需要进行处理。不同系统的换行符对比如下:

操作系统换行符英文表述制表符/十六进制代码
MAC OS回车Carriage Return,CR换行符,\r0x0D
Unix & Linux换行Line Feed,LF回车符,\n0x0A
Dos & Windows回车+换行CR/LF回车符/换行符,\n\r0x0D 0x0A

换行符不同导致的一个直接后果是,Unix/Mac系统下的文件在 Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个**^M**符号。一般操作系统上的运行库会自动决定文本文件的换行格式.,如一个程序在windows上运行就生成CR/LF换行格式的文本文件,而在Linux上运行就生成LF格式换行的文本文件。

  • 转换行符的方法:

转换文件格式为目标操作系统的文件格式即可,因为系统会自动转换换行符。

6.2.3.3 行尾追加分隔符的原因

有行尾分隔符的情况下,SybaseIQ会多线程加载文件,更快。注意分隔符的设置与操作数据的系统一致即可。

6.2.3.4 Linux中一步完成

将Linux中数据准备的三条命令整合到一起,并且使用通配符等命令,对符合条件的所有文件进行转换操作。

  • 命令如下:
ls *.csv | xargs -I {} /bin/bash -c "iconv -f utf-8 -t gb18030 -o {} {}; dos2unix {}; sed -i 's/$/|\!/g' {}"
  • 分步解释如下:
ls *.csv |

将目标文件筛选出来,并通过管道符将其传递给后续处理命令。

xargs -I {}

xargs命令的作用,是将标准输入转为命令行参数。如果xargs要将命令行参数传给多个命令,可以使用**-I参数。使用-I指定一个替换字符串{},这个字符串在xargs扩展时会被替换掉,当-I**与xargs结合使用,每一个参数命令都会被执行一次。

/bin/bash -c "cmd string"

使用-c参数,以执行字符串格式的命令。

6.3 导入数据

6.3.1 使用Interactive SQL导入

使用前序安装的Windows组件Interactive SQL连接数据库后,执行以下SQL语句即可将数据库所在服务器中的/home/rex/data/branch.csv.dat文件导入到SybaseIQ数据库中。该文件即为上述数据准备的结果。

LOAD TABLE branch(
	id '|!',
	prov '|!',
	v9 '|!',
	a6 '|!'
) from '/home/rex/data/branch.csv.dat'
DEFAULTS ON
STRIP RTRIM
QUOTES OFF
ESCAPES OFF
NOTIFY 1000000
ROW DELIMITED BY '\x0a'
with checkpoint on;
commit;

7.3.2 使用ADS导入

使用同样的SQL代码在ADS导入数据时,会报错提示找不到行分隔符,但是可以看到下述SQL语句中是指定了的。其实这是因为ADS使用的连接驱动中escape_character设置为了off,所以无法进行识别,导致出错。

图片

首先查看escape_character的设置。

select * from sp_iqcheckoptions() where Option_name = 'escape_character'

然后更改escape_character的设置。

set option dlabiquser.escape_character='on'

值得注意的是,每次使用ADS重新连接SybaseIQ后都需要重新设置该参数。

7 SybaseIQ导出数据

导出数据实际上就是把原输出内容写入目标文件中。

-- 设置以追加方式导出
set temporary option temp_extract_append='ON'
-- 设置分隔符
set temporary option temp_extract_column_delimiter='${dlmString}'
-- 设置SybaseIQ服务器上的导出目标文件
set temporary option temp_extract_name1='${fileName}'
-- 执行SQL查询语句
SELECT * FROM TABLENAME
-- 导出完成后要及时关闭,以免影响后续操作
set temporary option temp_extract_name1=''

8 SQL应用

8.1 常用语句

8.1.1 SELECT INTO

复制表结构和数据到新表中。

select * into table_temp from table_name

也可以通过where子句的设置,达到仅复制表结构的目的。

select * into table_temp from table_name where 1=2

8.1.2 获取月末日期

根据指定的月末日期,获取下个月末日期。因为每个月天数可能不同,因此不能直接运算。思路:本月末日期→下月初日期→下下月初日期→下月末日期。

select dateformat(
          dateadd(day, -1, 
            dateadd(month, 1, 
              dateadd(day, 1, '20200131')
            )), 'yyyymmdd')

8.2 单引号和双引号

SQL中一般都使用单引号,只有在下列情况下才会使用双引号:列名/表名中包含关键字、特殊字符或保留字。示例及其运行结果如下:

序号SQL语句备注执行结果
selectfrom table
select1as"select", 2as"from table"-12
select’1’as"select", 2as"from table"-12
select"1"as"select", 2as"from table"-Column ‘1’ not found
select’ " 'as"select", 2as"from table"-"2
select" ’ “as"select”, 2as"from table"-Column ’ ’ ’ not found
select’’’'as"select", 2as"from table"四个单引号2

对比①②③或对比④⑤,得出:对于一般的值,不能使用双引号。

对于⑤,想要查出来单引号,需要使用两个单引号包住一个单引号,共三个单引号。但是需要对中间的单引号进行转译处理,即在其前面再加一个单引号,所以有了⑥的样式。

8.3 execute语句

execute()函数接受一个字符串sql语句输入,并执行该语句,可用于复杂sql语句的拼接或循环内部。值得注意的是,应尽可能少的使用execute()函数,因为其内部的sql语句一般比较复杂,存在多个引号的情况,难以维护。

表名或字段名是否参数化,决定了是否必须要使用execute(动态执行)。

execute()语句的编写可参照以下四个步骤:

8.3.1 写出execute()函数形式

execute('
')

8.3.2写出所用变量

使用操作符将所用变量包裹起来,方便在execute语句中直接替换原SQL中的变量。

'||@datadate||'

或者

'+@datadate+'

两者的差别在于当需要拼接的两部分为不同数据类型时(如字符串和数值),使用**+****可能会存在数据类型不支持的问题,需要先使用函数将数据类型转换统一,而使用|******就不存在这个问题。

8.3.3 把语句中所有单引号替换为双单引号

select NUM_ACC,AMT_201606 from DATA_20160630 where DATE_POST=''20160630'' and TXT_TR like ''%交易%''

8.3.4 组装并补充完整

declare @datadate char(8)
set @datadate = '20160630'
execute('
    select NUM_ACC,AMT_'||substring(@datadate,1,6)||' from DATA_'||@datadate||' where DATE_POST='''||@datadate||''' and TXT_TR like ''%交易%''
')

8.4 循环和游标遍历

8.4.1 循环语法

WHILE 条件表达式
  BEGIN
    循环语句
  END 

8.4.2 游标语法

DECLARE 游标名称 CURSOR FOR 
SELECT 字段1,字段2,字段3,... FROM 表名 WHERE ...
OPEN 游标名称
FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
WHILE @@FETCH_STATUS=0
  BEGIN
    SQL语句执行过程... ...
    FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
  END
CLOSE 游标名称
DEALLOCATE 游标名称

8.4.3 应用举例

场景:删除用户(dlab)名下所有数据表。

--用游标cursor删除
declare @tname varchar(25)
declare tname_cursor cursor for 
select b.user_name||'.'||a.table_name
from SYSTABLE a, SYSUSER b
where a.creator=b.user_id
and b.user_name = 'dlab'
open tname_cursor with hold
fetch tname_cursor into @tname
while @@sqlstatus=0
  begin
    execute('
      drop table if exists '+@tname+'
    ')
    fetch next tname_cursor into @tname
  end
close tname_cursor
deallocate tname_cursor
注:
在使用游标的时候,@@sqlstatus保存着FETCH语句执行状态的信息,其值与含意如下:
0:成功完成FETCH语句;
1:FETCH语句有错误;
2:表示结果集中不再有数据,即游标已经移至结果集中最后一行,并已经提交了一条FETCH语句。

8.5 常见场景

8.5.1 月结表的并表操作

有时为了留存历史数据方便,将一个月的数据存入一张月结表中,并用月末日期做表名后缀,例如DATA_20160630。

然而在使用这部分数据时,会有合并近几个月数据的需求。针对这种重复性很强的工作,写了下面的SQL语句,只需要指定相应的表名、字段名、日期等参数即可自动合表。

/* 用于把各月份数据表合并成一个表 */
-- 参数设置
declare @target_tablename varchar(50), @tablename_pre varchar(50), @columns varchar(120)
declare @startdate char(8), @interval varchar(8), @num integer, @n integer = 0, @currentdate char(8)
set @target_tablename = 'data_test'
set @tablename_pre = 'data_'
set @columns = 'NUM_ACC, NUM_CARD'
set @startdate = '20200131'  
set @interval = 'month'
set @num = 3
-- 创建用于存储合并后数据的空表
execute('
    drop table if exists '||@target_tablename||'
    select '||@columns||' into '||@target_tablename||' from '||@tablename_pre||''||@startdate||' where 1=2
')
-- 整合各表中数据
while @n < @num
  begin
    set @currentdate = (select dateformat(dateadd(day, -1, dateadd(month, @n, dateadd(day, 1, @startdate))), 'yyyymmdd'))
    execute('
      insert into '||@target_tablename||' select '||@columns||' from '||@tablename_pre||''||@currentdate||'
    ')
    set @n = @n + 1
  end

8.5.2 活动达标客户提取

某营销活动的奖励达标规则:客户使用信用卡消费的单笔金额满200元(含)且满2笔,活动总名额为3名,先到先得。提供的数据字段有:客户唯一标识ACC、交易金额AMT、交易时间TIME。

8.5.2.1 思路一:使用OVER (PARTITION BY)函数

-- 对每名客户的交易记录按时间顺序排号,并将中间结果保存
select 
  ACC, 
  TIME, 
  row_number() over 
    (partition by ACC order by TIME asc) as rank_id 
into samples_temp
from samples
where AMT >= 200
-- 仅看满足单笔消费条件的第2笔交易即可
select top 3 ACC, TIME
from samples_temp
where rank_id = 2
order by TIME asc

8.5.2.2 思路二:构建累积表

-- 准备中间表
select * into samples_temp from samples where 1=1
alter table samples_temp add CNT int default 0
-- 更新中间表中的时间序号
update samples_temp a set CNT=( 
    select count(AMT)
    from samples_temp 
    where AMT >= 200
    and ACC = a.ACC
    and TIME <= a.TIME
)
-- 查询满足条件的客户
select top 3 ACC, TIME
from samples_temp
where CNT = 2
order by TIME asc

By 韩梦成

  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页

打赏作者

feifanhanmc

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值