前言:做為一名資料開發人員,難免在作業中遇到各種資料庫的各種問題,下面總結如下,希望對遇到此類問題的各位同仁有所幫助,也希望大家多多指正和下方留言實際生產中遇到的關于資料庫的各種疑難問題和解決方案,大家互相探討學習
1 怎么進行行列轉換?

將上面上圖轉換為下圖形式

Oracle語法:
with temp as(
select ‘50923’ 總在位人數 ,‘4126’ 不在位人數,‘46797’ 在位人數 from dws_fr_qyjbxx_df
)
select num,sort from
temp
unpivot
(num for sort in (總在位人數,不在位人數,在位人數))t;
具體效果如下:

2 需求:需要兩張表,這兩張表沒有關聯,需要這兩張表查出來的sql結果

法一:

法二:
select bzrs,tssj,(select xm from dws.dws_zrr_bzxx_df) xm from dws.dws_zrr_jzxx_df limit 3;
搞一個子查詢(把B表的B1當做第四列) ,SELECT A1,A2,A3,(SELECT B1 FROM B) B1 FROM A
PS:不建議這樣搞,寫了個標量子查詢,被同事發現會被噴的

法三:
select
t1.a1,t1.a2,t1.a3,t2.b1
from A t1
join B t2
on 1=1
結論:推薦第一種和第三種方法,首選第三種方法
3 就是原資料中6月22日沒有這個資料,但是最后頁面顯示想顯示這條資料為2021-06-22 西門入口2_門_1 0
解決思路如下:
SELECT to_char(generate_series(to_date(‘2021-01-01’,‘yyyy-mm-dd’), to_date(‘2022-01-01’,‘yyyy-mm-dd’), ‘1 day’),‘yyyy-mm-dd’) as rq;這句sql可以生成一個時間序列,然后以時間為主表,去關聯資料;
以日期為主表,就會所有日期都有;需要把resourname對應的維度表也關聯進去,日期先關聯resourname,然后再關聯資料表就有了,相當于就用到三張表,一張日期維度表,一張resourname維度表,一張資料表;以那兩張維度表為主表,笛卡爾積后會羅列出所有維度組合,然后再去關聯資料,沒有的補0
最終結果截圖如下:

4 union前后欄位超過64個報錯

錯誤原因分析:
是因為union是做了去重的,而hive的去重應該是用的group by的演算法實作的
此場景延伸問題如下:
就是前面的表相當于一個拉鏈表(比如有資料 01 李三 02 李四),后面表是正常全量表(比如有資料 01 李三 02 李四 03王五),剛剛上面那個操作是想得到ID為01和02的這個人的ID,如果我用union all加group by 加count(aaa.id)>1是不等效操作了?跟union 加 group by 加count(aaa.id)>1;因為union更像是union all加group by的聯合體,hive限制Grouping sets size不能超過64
解決方案如下:
想得到ID為01和02的這個人的ID:
select id from dwd_xcvtc.dwd_xxjs003_hz t1
where exists(select 1 from ods_xcvtc.ods_jzg_jzgjbxx_df t2 where t1.id=t2.id)
想拿03就用not exists
如果是只有ID相同,其他條件不同,需要再改下哪里,比如姓名變了,但是ID沒變,而且確定ID一定不會變,比如01 李三 變為 01 李六這樣
解決方案如下:

給這里拼條件就好了,如果要判斷所有欄位的話建議不要在這拼一大串條件了;比如你要判斷后面五十幾個欄位有沒有變化,你可以衍生一個欄位,根據非ID那50個欄位用MD5演算法生成一個加密的字串,判斷那個字串是否相等,MD5演算法只要輸入相同那輸出必然相同,所以只要那些欄位相同,那么通過MD5演算法得出的結果必然是相同的
5 關于row_number視窗函式失效的問題

如果有分組,組內排序就是1

此處需要注意的是:先分組再排序是組內排序,比如你按照學號分組,因為一個人只有一條記錄,所以排出來全都是1,還是要整理清楚需求,然后理解這個函式用法
6 怎么把一個SQL陳述句直接當做引數一樣傳到from之后,直接使用?
具體需求:
1 從aaa表存幾個欄位,欄位名q為指標型別,欄位名d為計算邏輯,就是form后面的部分
2 在bbb表進行指標計算,select * from (select d from aaa where q=‘班級’) t1
3 把查到的結果插入到ccc表
4 推送到業務庫
解決思路:
把欄位名d當引數并可以直接使用做為SQL查詢陳述句那就得存盤程序或者Python代碼或者Shell代碼實作;所有維護在表中的東西都只能當一個字串查出來,不能作為sql的關鍵字
具體解決:用Python代碼+SQL代碼實作

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293135.html
標籤:其他
