sql语句将两个查询结果并列输出

说白了,使用UNION ALL产生两个并行的SQL结果,关键在于保证列名、列号、数据类型都正确。

我们先来说说最重要的事情。
去年我们跑电商报表项目,在合并用户行为和订单数据时差点卡住:表1 有5 列,表2 少了1 列ID,直接报“列不匹配”错误。
还有一点,3 000级数据使用UNION会去掉最重的逻辑,比UNION ALL慢3 0%左右。
例如,在计算两个通道的曝光时。
还有另一个基本细节。
例如,表 1 的年龄为 INT,表 2 的年龄为 VARCHAR。
SQL会自动进行类型转换,但效率较低。
起初我以为它们可以混合使用,但后来我发现这是错误的,我必须先统一格式。

等等,还有一件事,UNION 本身可以排序,但不要被愚弄:默认是按第一个查询的结果排序。
去年,一位同事将快速排序表放在底部,总体结果使时间增加了一倍。

建议先对齐列,然后使用UNION ALL处理大数据。
对于排序要求,单独添加ORDER BY。

sql 根据条件排名

说实话,这三个排序函数用起来还是蛮有趣的。
我之前已经把它们弄乱过好几次了。
我们先来谈谈RANK()OVER。
这特别适合于您想知道谁是第一、谁是第二的情况,但是并列的两个朋友必须占据相同的排名,而他们后面的人必须跳过排名。
以我之前列出的一个电商平台的月销售样本为例。
假设有三个人并列获得冠军。
那么下个月的新冠军将是第四名,而不是第三名。
这是RANK()最明显的特点,排名会断崖式下跌。

DENSE_RANK() 并不是那么占主导地位。
它看起来与 RANK() 类似,但个性更柔和。
还是电商销售冠军的例子,三个冠军旗鼓相当,但下个月的新冠军将直接第三,排名还会继续下滑。
我记得使用 DENSE_RANK() 来处理某个 KOL 列表。
数据量不大,但是并行的情况很多。
效果还是不错的,不会出现意外的排名问题。

ROW_NUMBER()是最简单、最粗暴的。
它只是按顺序标记每一行,无论您的数据是否重复。
我最近在制作报告仪表板时使用了它。
例如,要在页面上显示用户行为数据,直接使用ROW_NUMBER() OVER(PARTITION BY page_id ORDER BY timestamp)可以保证同一页面数据的顺序不乱。
老实说,ROW_NUMBER() 正是这种情况下的选择。

但最容易让人误解的是按照这三个功能来划分。
我以前遇到过一个陷阱,使用 RANK() 对同一个表进行排序。
结果因为我没有加分隔符,整桌乱七八糟,差点被老板骂了。
后来了解到按部门排序时必须添加部门id作为分区键,否则排序完全没有意义。
我个人没有运行过 DENSE_RANK() 和 ROW_NUMBER() 的复杂分区场景,但我记得数据大约是