MySQL实战案例100例(一)-如何解决非等值范围查找问题?
需求背景
有兩張表,A表記錄了很多款產品的三個基礎字段,分別是產品ID,地區代碼和重量:
B表是運費明細表,這個表結構很“業務”。每行對應著單個地區,不同檔位重量,所對應的運費:
比如121地區,0-0.5kg的產品,運費是5.38元;2.01(實際應該是大于1)-3kg,運費則是5.44元。
現在,我們想要結合A表和B表,統計出A表每個產品付多少運費,應該怎么實現?
可以先自己思考一分鐘圖片
解題思路
人海戰術
A表一共215行,我們只需要找215個人,每個人只需要記好自己要統計那款產品的地區代碼和重量字段,然后在B表中根據地區代碼,找到所在地區運費標準,然后一眼掃過去,就能得到最終運費了。
兩個“只需要”,問題就這樣easy的解決了。
問題變成了,我還差214個人。
解構戰術
通過人海戰術,我們其實已經明確了解題的樸素思路:根據地區代碼和重量,和B表匹配,返回運費結果。
難點在于,B表是偏透視表結構的,運費是橫向分布,用Pandas就算用地區代碼匹配,還是不能找到合適的運費區間。
怎么辦呢?
如果我們把B表解構,變成“源數據”格式,問題就全部解決了:
轉換完成后,和A表根據地區代碼做一個匹配篩選,答案就自己跑出來了。
下面是動手時刻。
具體實現
先導入數據,A表(product):
B表(cost):
要想把B表變成“源數據”的格式,關鍵在于理解stack()堆疊操作,結合示例圖比較容易搞懂:
通過stack操作,把多列變為單列多行,原本的2列數據堆成了1列,從而方便了一些場景下的匹配。要變回來也很簡單,unstack即可:
在我們的具體場景中,先指定好不變的索引列,然后直接上stack:
這樣,就得到了我們目標的源數據。接著,A表和B表做匹配:
值得注意的是,因為我們根據每個地方的重量區間做了堆疊,這里的匹配結果,每個產品保留了對應地區,所有重量區間的價格,離最終結果還有一步之遙。
需要把重量區間做拆分,從而和產品重量對比,找到對應的重量區間:
接著,根據重量的最低、最高區間,判斷每一行的重量是否符合區間:
最后,篩選出符合區間的產品,及對應的價格等字段:
數據源
地區代碼 地區縮寫 0~0.5 0.501~1 1.01~2 2.01~3 3.01~4 4.01~5 5.01~7 7.01~10 10.01~15 15.01~100000 121 AS 5.38 5.38 5.38 5.44 5.53 5.58 5.58 6.09 6.1 6.24 122 BW 6.70 6.80 7.13 7.49 7.85 8.21 9.05 10.04 11.69 13.96 123 Gos 7.21 7.34 7.68 8.09 8.46 8.88 9.8 10.88 12.65 15.11 124 Wol 7.21 7.34 7.68 8.09 8.46 8.88 9.8 10.88 12.65 15.11 125 New 7.21 7.34 7.68 8.09 8.46 8.88 9.8 10.88 12.65 15.11 126 Can 7.21 7.34 7.68 8.09 8.46 8.88 9.8 10.88 12.65 15.11 127 Alb 7.21 7.31 7.65 8.05 8.46 8.86 9.76 10.84 12.61 15.09 128 Twe 7.21 7.23 7.64 8.04 8.44 8.84 9.75 10.83 12.61 15.09 129 NSW 8.93 9.71 10.85 12.01 13.16 14.4 16.71 20.19 26 34.2 130 Mel 6.75 8.04 8.51 8.9 9.41 9.95 10.94 12 14.08 17.13 131 Mlo 7.14 8.43 8.86 9.34 9.85 10.35 11.45 12.66 14.73 17.93 132 Gee 7.69 10.83 11.49 12.25 12.99 13.74 15.39 17.25 20.38 25.28 133 Bal 7.69 12.36 13.29 14.28 15.29 16.28 18.45 20.95 25.23 31.86 134 Wod 7.69 9.75 10.39 11.08 11.8 12.51 14.08 15.84 18.85 23.54 135 VIC 8.74 14.59 15.74 16.98 18.18 19.46 21.73 24.88 30.14 38.41 136 Bri 6.83 7.94 8.38 8.86 9.41 9.99 11.03 12.15 14.1 17.1 137 BTT 7.36 8.34 8.83 9.34 9.9 10.41 11.61 12.94 15.21 18.74 138 Ips 7.93 10.91 11.84 12.84 13.86 14.83 17.04 19.63 23.98 30.79 139 Gol 7.93 9.30 10.20 11.13 12.09 13.08 15.08 17.53 21.65 28.14 140 Coo 7.93 9.59 10.26 11.01 11.76 12.55 14.23 16.13 19.4 24.55 141 Sun 7.93 10.86 11.84 12.86 13.88 14.83 17.04 19.63 23.99 30.8 142 QA 9.04 13.84 15.31 16.81 18.3 19.84 22.64 26.44 32.91 43.01 143 QLD 9.04 14.50 16.70 18.89 21.13 23.4 27.56 33.33 43.26 58.7 144 LDQ 9.04 14.81 17.30 19.81 22.33 24.91 29.71 36.23 47.55 65.23 145 Ade 7.15 8.40 9.04 9.66 10.28 10.96 12.39 14.08 16.94 21.43 146 AD 7.36 8.44 9.05 9.7 10.34 11.03 12.49 14.15 17.06 21.55 147 SA 9.04 14.20 16.13 18.03 19.99 21.96 25.68 30.69 39.41 59.41 148 Per 7.31 10.50 11.95 13.45 14.94 16.45 19.25 23.1 29.69 39.99 149 Pe 7.51 10.79 12.25 13.81 15.33 16.85 19.75 23.66 30.43 40.96 150 WA 9.04 16.25 20.23 24.25 28.35 32.5 40.31 51.03 69.5 98.51 151 WAE 9.04 16.39 20.49 24.64 28.86 33.18 41.16 52.19 71.26 101.09 152 Tas 7.30 10.23 11.33 12.46 13.66 14.85 17.04 20.05 25.24 33.31 153 TWB 8.41 11.48 12.70 13.95 15.3 16.63 19.09 22.49 28.3 37.35 154 NTA 9.04 16.34 20.39 24.49 28.66 32.9 40.88 51.79 70.66 100.2 155 NTB 9.04 16.34 20.39 24.49 28.66 32.9 40.88 51.79 70.66 100.2 156 Nor 7.75 12.73 14.96 17.19 19.43 21.66 25.9 31.68 41.71 57.31 157 Chr 7.75 14.43 17.35 20.31 23.26 26.21 31.81 39.48 52.76 73.41 158 Aus 7.75 11.81 13.11 14.44 15.74 17.04 19.54 22.94 28.81 37.98總結
以上是生活随笔為你收集整理的MySQL实战案例100例(一)-如何解决非等值范围查找问题?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作为一个算法攻城狮,你训练的算法翻车了该
- 下一篇: C语言过时了吗?不,我们需要的是一份个人