需求如下:
表flight_sale_history:
discount: 折扣
air_code: 航班号
表discount_cabin:
air_code: 航班号
discount: 折扣
cabin: 舱位数组
要求对flight_sale_history中的每一条记录,求出discount_cabin中折扣最接近的舱位数组的第一个舱位。
想法:
1. 将discount_cabin变成每个air_code一条记录,discount和cabin变成一个数组字段。
SELECT air_code, groupArray(array(toString(discount), cabin[1])) d2 FROM discount_cabin GROUP BY air_code
这里用到了array()把两个值变成一个数组, groupArray把一组值变成一个大数组。因为array不支持浮点数和字符串放一起, 所以需要将浮点数变成字符串
2. 将flight_sale_history和上面的SQL join, 对上面的大数组,对flight_sale_history中discount和大数组的discount的差值的绝对值排序,第一个就是折扣最接近的那个。
arraySort(x -> abs(h.discount – toFloat32(d2[1])), d2)
完整的SQL为
select h.air_code, arraySort(x -> abs(h.discount – toFloat32(d2[1])), d2)[1][2] from flight_sale_history h inner join
(SELECT air_code, groupArray(array(toString(discount), cabin[1])) d2 FROM discount_cabin GROUP BY air_code) d on h.air_code=d.air_code