筆者在這篇文章中提到了如何使用SQL來完成時(shí)間段的一個(gè)合并,在完成該任務(wù)的同時(shí)不禁感嘆為啥提供的這些函數(shù)功能剛好能滿足我的需求。如果從一個(gè)API的提供方,或者是庫的開發(fā)人員來講,提供一個(gè)顆粒分明,功能全面的API是特別考驗(yàn)一個(gè)開發(fā)者能力的。
讓我們來從頭思考這個(gè)時(shí)間段合并的問題。作為一個(gè)數(shù)據(jù)開發(fā)工程師,我在開發(fā)UDF的時(shí)候,是不是也得有類似庫開發(fā)人員的素養(yǎng)和考慮。將問題拆解為幾個(gè)通用的步驟,并使用組合來完成這個(gè)任務(wù)。
至于怎么拆解?
- 一種是自己手動拆解過程。
- 一種則是借鑒別人的方法,比如我們看看用其他語言實(shí)現(xiàn)該功能的時(shí)候,都用到了哪些庫函數(shù),然后我們用UDF實(shí)現(xiàn)同樣的庫函數(shù)即可。
假如我們采用編程語言該怎么實(shí)現(xiàn)這個(gè)業(yè)務(wù),我用GPT生成了Python代碼如下:
def merge_intervals(intervals):
# Sort the intervals based on the start time
intervals.sort(key=lambda x: x[0])
merged = []
for interval in intervals:
# If the list of merged intervals is empty or the current interval does not overlap with the previous one,
# simply append it.
if not merged or merged[-1][1] < interval[0]:
merged.append(interval)
else:
# Otherwise, there is overlap, so we merge the current and previous intervals.
merged[-1][1] = max(merged[-1][1], interval[1])
return merged
# Given intervals
intervals = [[1, 3], [2, 7], [5, 6], [4, 11], [10, 11], [11, 14]]
# Merging the intervals
merged_intervals = merge_intervals(intervals)
merged_intervals
從上面其實(shí)我們可以看到該函數(shù)使用了很多Python內(nèi)置的函數(shù):
sortappendmax
這樣我們就很容易提取出來我們要實(shí)現(xiàn)的通用UDF了。
但是,這種取巧的方法還是漏掉了一個(gè)最大的通用函數(shù),那就是聚合函數(shù),這個(gè)其實(shí)是隱藏在上面的Python代碼的for循環(huán)當(dāng)中的。如果你能提取到這個(gè)聚合函數(shù),那么說明你的能力起碼超越了一般的開發(fā)者了。
ps:
生成上述Python代碼的prompt如下:
你是一個(gè)軟件工程師,現(xiàn)在有2列數(shù)據(jù),如下所示:
1,3
2,7
5,6
4,11
10,11
11,14
第一列是開始時(shí)間,第二列是結(jié)束時(shí)間,每一行是一個(gè)時(shí)間段,寫一個(gè)Python代碼讀取上述格式的數(shù)據(jù),將所有的時(shí)間段進(jìn)行合并,合并規(guī)則如下:
1. 如果2個(gè)時(shí)間段的范圍有重合,則將其合并成一個(gè)新的時(shí)間段,新的時(shí)間段的開始時(shí)間是2個(gè)時(shí)間段的最小值,結(jié)束時(shí)間是2個(gè)時(shí)間段的最大值
2. 如何2個(gè)時(shí)間段的范圍沒有有重合,則將其保留
輸出:合并之后的所有時(shí)間段