教你如何運用自聯接(不太明白)

2021-04-14 01:46:31 字數 1261 閱讀 5054

sql有乙個技巧可以運用自聯接來把每一行與下一行對應。像上面這種查詢,你可以製造像秩(rank)或者位置(position)、行差(row differences)、累積總計(running total)等等的資料……

【it專家網獨家】如果不使用分析函式,怎麼樣能夠查詢累積和?例如:

1    150          150

1    190   340

2     140    480

3    80     560

3       10      570

8    90       660

6          190            850

專家回答:

sql有乙個技巧可以運用自聯接來把每一行與下一行對應。像上面這種查詢,你可以製造像秩(rank)或者位置(position)、行差(row differences)、累積總計(running total)等等的資料。

在這個自聯接中,需要指定乙個聯接條件。你不可以簡單地把每一行跟其他所有行聯接(這會變成交叉聯接)。你需要把每一行跟下一行聯接起來。

如果你知道哪一行是下一行,這就很容易辦到。顯然,因為我們都知道在關聯式資料庫**中沒有所謂的行的位置,所以只能通過乙個或多個列上的值來進行操作。行可以儲存在任何地方。只能在select語句中運用order by從句來完成排序。在不等比較運算子中,排序也是隱函式。

例如,自聯接中一行在聯接列中的值比另一行大:  

select ...

from datable as r1

left outer

join datable as r2

on r2.foo > r1.foo

這裡,每一行(rl)與所有foo列的值更大的行(r2)聯接。這是絕對有效的乙個自聯接。

但是,這還不是完整的解決方案,因為我們想要做的是把每一行與有更高值的另一行相聯接,即有更高值的所有行中值最小的行,也就是只跟下一行聯接。不難發現要完成這一點需要使用min()的子查詢。

但是,現在讓我們先停下來,回過頭來看一下上面這個例子中的實際問題。如果中間一列是被計算的資料,而右邊一列是累計和,這樣我們只剩下左邊一列可以用於自聯接的on從句。

很不幸,左邊那一列資料並非順序排列。這些抽樣資料不足。

教你如何運用python golang實現迴圈鍊錶

這篇文章主要介紹了python golang如何實現迴圈鍊錶,幫助大家更好的理解和學習迴圈鍊錶的實現方法,感興趣的朋友可以了解下 迴圈鍊錶就是將單鏈表的末尾指向其頭部,形成乙個環。迴圈鍊錶的增刪操作和單鏈表的增刪操作區別不大。只是增加時,需要考慮空鍊錶增加第乙個節點的特殊情況 刪除時需考慮刪除節點是...

教你迅速運用Summary

在研究tensorflow自帶的例程speech command,順便學習tensorflow的一些基本用法。其中tensorboard 作為一款視覺化神器,可以說是學習tensorflow時模型訓練以及引數視覺化的法寶。而在訓練過程中,主要用到了tf.summary 的各類方法,能夠儲存訓練過程以...

教你如何運用golang 實現陣列的隨機排序

本文主要介紹了golang 陣列隨機排序的實現,文中通過示例 介紹的非常詳細,具有一定的參考價值,感興趣的小夥伴們可以參考一下 前言 目前接到乙個推薦資料的需求,需要將資料庫中獲取到的資料進行隨機排序後返回給使用者。考慮了一下,有兩種使用方式,一種是通過資料庫 order by rand 還有一種就...