1. hive中count和sum的區別
首先,sum是對一個欄位進行求和,hive中欄位的類型一般是string或者int,如果是int當然沒問題,如果是string類型但是全部是數字也沒問題,如果包含一個字母sum出來將會是0.
假如有這樣一張簡單的表
user_id stringshop_id string
1234hello
12341234
那
么sum(user_id)的結果是2468,sum(shop_id)的結果是0.如果沒有符合條件的記錄,sum的返回值將是null,如
sum(case when user_id<1000 then shop_id
end)返回值將是null。但某些時候我沒希望sum的結果如果沒有符合條件的記錄就返回0怎麼辦呢,可以用coalesce(shop_id,0)解
決這個問題。
count是對數據記錄的條數進行統計,有一條符合的記錄就是1,沒有就是0.
前幾天遇到這樣一條sql語句,sum(case when
substr(gmt_receive_pay,0,13)='$cur_date $env.last_hour' then t2.total_fee end)
as hour_alipay_fee,
我知道這條語句當沒有符合條件的記錄時計算出來結果是null,但是我沒有意識到這是一個bug,我們要的結果應該是0。檢討一下。
2. sql substring()從右邊開始截取字元串
1、創建測試表,create table test_substr(value varchar2(200));
3. sql 截取某個字元之前的數據
CREATE PROCEDURE pim_Utility_ReadCRMSaleLead
AS
select A.ProjectName as '項目名稱', A.SaleDistrict as '項目所在地',A.Address as '客戶地址', SUBSTRING(1,CHARINDEX(『+』,A.RelateLead1)- 1,LEN(A.RelateLead1)) as '設計院',
A.BudgetNumber as '預計容量',A.Finish_On as '訂貨時間' ,
A.WorkStatus as '狀態', B.FolderId
INTO #Temp0 from pimCRMSaleLead A ,pimCRMLead B
where A.CustomerId *= B.LeadID
update #Temp0 set #Temp0.項目所在地=C.Name FROM pimDataClassFolder C WHERE #Temp0.FolderId=C.FolderId
SELECT * FROM #Temp0
GO
4. sql中如何在where字句里截取某個欄位的前幾位字元
sql中在where字句里截取字元方法如下:
1、如果是sqlserver:where left(p.end_time,4) = '2012'。
2、如果是Oracle:where substr(p.end_time,0,4) = '2012'。
舉例:
1、oracle: 'where substr(欄位名,1,2)='''123''''
2、sqlserver: 'where substring(欄位名,1,2)='''123''''
(4)hivesqlsubstr擴展閱讀:
sql中,常用函數介紹:
1、AVG():返回平均值
2、COUNT():返回行數
3、FIRST():返回第一個記錄的值
4、LAST():返回最後一個記錄的值
5、MAX():返回最大值
6、MIN():返回最小值
7、SUM():返回總和
8、UCASE():將某個欄位轉換為大寫
9、LCASE():將某個欄位轉換為小寫
10、MID():從某個文本欄位提取字元
11、LEN():返回某個文本欄位的長度
12、ROUND():對某個數值欄位進行指定小數位數的四捨五入
13、NOW():返回當前的系統日期和時間
14、FORMAT():格式化某個欄位的顯示方式
15、INSTR():返回在某個文本域中指定字元的數值位置
16、LEFT():返回某個被請求的文本域的左側部分
17、RIGHT():返回某個被請求的文本域的右側部分
5. oracleSQL語句轉換為hive識別的SQL語句
把like的部分改為
like concat(p_org_no,'%')
6. 在SQL語句中如何用正則取出一個字元串的前幾位數字
SQL 取字元串的前幾位數字,SQL 關鍵字 substring
substring 使用方法,參考下列SQL:
declare @T nvarchar(10)
set @T='12345abcde'
select substring(@T,1,5)
結果如下:12345
如果是SQL 寫正則表達式判斷,只能通過存儲過程或函數來處理
SQL 如下:
CREATE FUNCTION dbo.find_regular_expression
(
@source varchar(5000), --需要匹配的源字元串
@regexp varchar(1000),--正則表達式
@ignorecase bit = 0--是否區分大小寫,默認為false
)
RETURNS bit--返回結果0-false,1-true
AS
BEGIN
--0(成功)或非零數字(失敗),是由 OLE 自動化對象返回的 HRESULT 的整數值。
DECLARE @hr integer
--用於保存返回的對象令牌,以便之後對該對象進行操作
DECLARE @objRegExp integer DECLARE @objMatches integer
--保存結果
DECLARE @results bit
/*
創建 OLE 對象實例,只有 sysadmin 固定伺服器角色的成員才能執行 sp_OACreate,並確定機器中有VBScript.RegExp類庫
*/
EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
IF @hr <> 0 BEGIN
SET @results = 0
RETURN @results
END
/*
以下三個分別是設置新建對象的三個屬性。下面是'VBScript.RegExp'中常用的屬性舉例:
Dim regEx,Match,Matches '建立變數。
Set regEx = New RegExp '建立一般表達式。
regEx.Pattern= patrn '設置模式。
regEx.IgnoreCase = True '設置是否區分大小寫。
regEx.Global=True '設置全局可用性。
set Matches=regEx.Execute(string) '重復匹配集合
RegExpTest = regEx.Execute(strng) '執行搜索。
for each match in matches '重復匹配集合
RetStr=RetStr &"Match found at position "
RetStr=RetStr&Match.FirstIndex&".Match Value is '"
RetStr=RetStr&Match.Value&"'."&vbCRLF Next
RegExpTest=RetStr
*/
EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
IF @hr <> 0 BEGIN
SET @results = 0
RETURN @results
END
EXEC @hr = sp_OASetProperty @objRegExp, 'Global', false
IF @hr <> 0 BEGIN
SET @results = 0
RETURN @results
END
EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignorecase
IF @hr <> 0 BEGIN
SET @results = 0
RETURN @results
END
--調用對象方法
EXEC @hr = sp_OAMethod @objRegExp, 'Test', @results OUTPUT, @source
IF @hr <> 0 BEGIN
SET @results = 0
RETURN @results
END
--釋放已創建的 OLE 對象
EXEC @hr = sp_OADestroy @objRegExp
IF @hr <> 0 BEGIN
SET @results = 0
RETURN @results
END
RETURN @results
END
7. hivesql怎麼獲取上一個月月份
hivesql sql — 獲取指定hive表或指定文件所hive表DDL按區則默認執行近7區DDL同table支持符合sql語則表達式表匹配則提示用戶選擇(使用file則自關閉該交互功能)。
hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張資料庫表,並提供完整的sql查詢功能,可以將sql語句轉換為MapRece任務進行運行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapRece統計,不必開發專門的MapRece應用,十分適合數據倉庫的統計分析。另外一個是Windows注冊表文件。
8. hive中如何求兩個時間點之間相差月份數,我只知道datediff函數可以求天數
可以用datediff函數。
創建表及插入數據:
create table test
(begindate datetime,
enddate datetime);
insert into test values ('2015-01-01','2015-07-13')
執行:
select datediff(day,begindate,enddate) from test;
結果: