ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-06-29 13:03:16  阅读:484  来源: 互联网

标签:group SEQUENCE TH1 ID BASE 分组 USER DATE 多字段


本文介绍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)
);

在这里插入图片描述

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

在这里插入图片描述

求解过程

  • 步骤①:先得到每个用户最新交易日的所有数据。使用序列号和用户ID分组,求最新交易日数据。DML如下:

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

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

  • 步骤②:使用步骤①得到的结果和原数据结合(INNER JOIN),结合的条件为,交易日,序列号以及用户ID相同。JOIN后得到的结果集,也就只剩下了每个用户最新交易日的数据。这时再使用交易日和用户ID作为分组条件,用MAX()函数来求最大序列号即可。

结合图:
在这里插入图片描述
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的输出结果如下图:
在这里插入图片描述

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

  • 步骤③:使用步骤②得到的结果集,再次和原数据结合(INNER JOIN),结合条件为交易日,序列号,用户ID相同。

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

最终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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有