其他分享
首页 > 其他分享> > group by多字段多次分组(项目实例)

group by多字段多次分组(项目实例)

作者:互联网

本文介绍group by配合聚合函数在实际项目中的实例。

先模拟生成一个表模拟用户的交易记录,分别有交易日,序列号,用户ID,交易金额四个字段,并设置交易日,序列号,用户ID为联合主键。并插入一些测试数据,两名用户的共7条交易数据。

Q:现要求能够输出每个用户最后一个交易(即交易日最新,并且序列号为该交易日最大)的交易详细的SQL语句。

DDL如下:

CREATE TABLE IF NOT EXISTS trade_history(
    BASE_DATE DATE NOT NULL,
    SEQUENCE  INT NOT NULL,
    USER_ID   INT NOT NULL ,
    TRADE_AMOUNT INT NOT NULL,
    PRIMARY KEY(BASE_DATE,SEQUENCE,USER_ID)
);

在这里插入图片描述

按照题目要求,不难得出输出结果应为下图的两行数据。

在这里插入图片描述

求解过程

	SELECT
	    MAX(BASE_DATE) AS BASE_DATE,SEQUENCE,USER_ID
	FROM
	    TRADE_HISTORY
	GROUP BY 
	    USER_ID,SEQUENCE

输出如下如图:
在这里插入图片描述

结合图:
在这里插入图片描述
DML如下:

	SELECT
	    TH1.BASE_DATE,MAX(TH1.SEQUENCE) AS SEQUENCE,TH1.USER_ID
	FROM
	    TRADE_HISTORY TH1
	INNER JOIN
	    (
		SELECT
		    MAX(BASE_DATE) AS BASE_DATE,SEQUENCE,USER_ID
		FROM
		    TRADE_HISTORY
		GROUP BY 
		    USER_ID,SEQUENCE
	    ) TH2
	ON 
	    TH1.BASE_DATE = TH2.BASE_DATE
	AND
	    TH1.USER_ID = TH2.USER_ID
	GROUP BY
	    TH1.BASE_DATE,TH1.USER_ID

上述DML的输出结果如下图:
在这里插入图片描述

可见此时,每个用户的最新交易日和该交易日的最大交易序列号,都已经得到了。

结合图(红框内为结合条件):
在这里插入图片描述

最终DML语句,也是本问的解如下:

SELECT
    TH.BASE_DATE,TH.SEQUENCE,TH.USER_ID,TH.TRADE_AMOUNT
FROM 
    TRADE_HISTORY TH
INNER JOIN
    (
	SELECT
	    TH1.BASE_DATE,MAX(TH1.SEQUENCE) AS SEQUENCE,TH1.USER_ID
	FROM
	    TRADE_HISTORY TH1
	INNER JOIN
	    (
		SELECT
		    MAX(BASE_DATE) AS BASE_DATE,SEQUENCE,USER_ID
		FROM
		    TRADE_HISTORY
		GROUP BY 
		    USER_ID,SEQUENCE
	    ) TH2
	ON 
	    TH1.BASE_DATE = TH2.BASE_DATE
	AND
	    TH1.USER_ID = TH2.USER_ID
	GROUP BY
	    TH1.BASE_DATE,TH1.USER_ID
    )TH3
ON
    TH.BASE_DATE = TH3.BASE_DATE
AND
    TH.SEQUENCE  = TH3.SEQUENCE
AND
    TH.USER_ID   = TH3.USER_ID

上述DML最终得到的解:

在这里插入图片描述

标签:group,SEQUENCE,TH1,ID,BASE,分组,USER,DATE,多字段
来源: https://blog.csdn.net/glizhewen/article/details/106979521