[英]Getting table names and row counts for all tables in an athena database
我有一個包含多個表的 AWS 數據庫,我試圖在單個查詢中獲取行數。
理想的查詢輸出是:
table_name row_count
table2_name row_count
etc...
到目前為止,我已經能夠從數據庫中獲取所有表名或表的所有行數(以隨機順序),但不能在同一個查詢中同時獲取。
此查詢返回數據庫中存在的所有表名的列:
SELECT table_name FROM information_schema.tables WHERE table_schema = '<database_name>';
此查詢返回表的所有行數:
SELECT COUNT(*) FROM table_name
UNION ALL
SELECT COUNT(*) FROM table2_name
UNION ALL
etc..for the rest of the tables
這個查詢的問題是它以隨機順序顯示行計數,與查詢中表的順序不對應,所以我不知道哪個行計數與哪個表相關——因此我需要表名和行數。
只需將表的名稱作為文字添加到您的查詢中:
SELECT 'table_name' AS table_name, COUNT(*) AS row_count FROM table_name
UNION ALL
SELECT 'table_name2' AS table_name, COUNT(*) AS row_count FROM table_name2
UNION ALL
…
以下查詢生成 UNION 查詢以生成所有記錄的計數。 要解決的問題是(截至 2022 年 12 月) INFORMATION_SCHEMA.TABLES
錯誤地將每個表和視圖定義為BASE TABLE
,因此您需要一些邏輯來消除視圖。
在數據倉庫中,通常的做法是頻繁地記錄登錄表的記錄計數的快照。 任何與預期計數的意外偏差都可用於報告/警報
WITH Table_List AS (
SELECT table_schema,table_name, CONCAT('SELECT CURRENT_DATE AS run_date, ''',table_name, ''' AS table_name, COUNT(*) AS Records FROM "',table_schema,'"."', table_name, '"') AS BaseSQL
FROM INFORMATION_SCHEMA.TABLES
WHERE
table_schema = 'YOUR_DB_NAME' -- Change this
AND table_name LIKE 'YOUR TABLE PATTERN%' -- Change or remove this line
)
, Total_Records AS (
SELECT COUNT(*) AS Table_Count
FROM Table_List
)
SELECT
CASE WHEN ROW_NUMBER() OVER (ORDER BY table_name) = Table_Count
THEN BaseSQL
ELSE CONCAT(BaseSql, ' UNION ALL') END AS All_Table_Record_count_SQL
FROM Table_List CROSS JOIN Total_Records
ORDER BY table_name;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.