SQL/Hive 查询以计算特定值每天的行数
Posted
技术标签:
【中文标题】SQL/Hive 查询以计算特定值每天的行数【英文标题】:SQL/Hive Query to Count number of rows for each day for a certain value 【发布时间】:2020-08-10 05:07:40 【问题描述】:我目前正在编写一个 Python 脚本,该脚本使用查询从我们的 Hive 服务器中提取数据。我期望输出将根据“TxnCount”的输入过滤每天有 x 次或更多交易的卡号。
输入为:DateTime1、DateTime2、MerchantID、CardNum、terminalID 和 TxnCount。
我的代码(不工作):
Query = "SELECT TRIM(i002_number) as CardNum, i004_amt_trxn, TRIM(i042_merch_id) as MerchantID, i043a_merch_name, TRIM(i041_pos_id) as TerminalID, \
i049_cur_trxn, i062v2_trans_id, i003_proc_code, i006_amt_bill, i051_cur_bill, amt_card, cardcurrency, ltimestamp, \
i039_rsp_cd, i018_merch_type, i043b_merch_city, i043c_merch_cnt, i022_pos_entry, i032_acquirer_id, trxntype, reasoncode, \
SUBSTRING(i002_number, 1, 6) AS issuer_bin, COUNT(i002_number) as txncount\
CASE \
WHEN SUBSTRING(i002_number,1,1) = 5 THEN 'MasterCard' \
WHEN SUBSTRING(i002_number,1,1) = 4 THEN 'VISA' \
END AS source \
FROM tsys.ods_authorizations \
WHERE ltimestamp >= '"+DateTime1+"' AND ltimestamp <= '"+DateTime2+"' AND i042_merch_id = "+MerchantID+" \
AND i002_number = "+CardNum+" AND i041_pos_id = "+terminalID+""
HAVING txncount >= '"+TxnCount+"'
样本预期数据(截断):
CardNum TimeStamp TxnCount
123 2019-06-01 00:00:30.00 2
123 2019-06-01 05:00:20.00 2
123 2019-06-03 20:00:00.00 1
456 2019-06-04 06:00:00.00 2
456 2019-06-04 00:00:10.91 2
789 2019-06-01 12:00:40.51 1
我认为我的问题是它无法计算每个卡号,因为我遇到了 GROUP BY 子句的问题。另外,我还没有拆分日期和时间,查询还不能识别日期之间的差异。
【问题讨论】:
只是补充一下:正如您在选择部分看到的,我需要输出大约 20+ 列。如果不是这种情况,那么我可以通过添加以下内容轻松解决此问题:GROUP BY i002_number, DATE(ltimestamp) 如何添加简单的GROUP BY TRIM(i002_number),ltimestamp
并从 SELECT 条件中删除所有其他内容。但如果您想要所有列并计数,请使用COUNT(*) OVER (PARTITION BY TRIM(i002_number),ltimestamp ORDER BY TRIM(i002_number),ltimestamp ) as CNT
。 HTH
嗨@KoushikRoy,这很好用,谢谢。我还没有足够的分数来支持答案。但这是为了让您知道您的解决方案正在发挥作用。
@KoushikRoy 跟进问题,当我没有“HAVING”子句时它不起作用。什么可能是解决方案,因为我还需要让这个 HAVING 子句让查询接受 TxnCount 的输入。
我这个查询没有遵循一些基础知识。我相信,戈登的以下解决方案应该可以工作。如果没有,请像这样添加 ORDER BY COUNT(*) OVER (PARTITION BY i002_number, TRUNC(ltimestamp, 'DAY') ORDER BY i002_number, TRUNC(ltimestamp, 'DAY') ) as txncount
【参考方案1】:
您的查询格式不正确。你有一个COUNT()
和一堆其他的列——你没有GROUP BY
。这在 SQL 中是不允许的。
我建议您也使用参数,而不是修改查询字符串。所以,你大概想要这样的东西。
您的结果似乎需要每笔交易的详细信息,而不是摘要(因此您有两行计数为“2”而不是一个)。这表明您确实需要窗口函数:
SELECT a.*
FROM (SELECT a.*,
(CASE WHEN i002_number LIKE '5%' THEN 'MasterCard'
WHEN i002_number LIKE '4%' THEN 'VISA'
END) AS source
COUNT(*) OVER (PARTITION BY i002_number, TRUNC(ltimestamp, 'DAY')) as txncount
FROM FROM tsys.ods_authorizations a
WHERE ltimestamp >= :timestamp1 AND
ltimestamp <= :timestamp2 AND
i042_merch_id = :MerchantID AND
i002_number = :CardNum AND
i041_pos_id = :terminalID
) a
WHERE txncount >= :TxnCount
【讨论】:
以上是关于SQL/Hive 查询以计算特定值每天的行数的主要内容,如果未能解决你的问题,请参考以下文章
HIVE/Impala 查询:计算满足特定条件的行之间的行数