用戶上傳截圖詢問 Java 對數據庫表字段進行統計的相關問題,但截圖內容未在文本中呈現。根據文件名推測為 2017 年 1 月的提問。
-- 字段非空率、唯一值數、最值、平均值等
SELECT
COUNT(*) AS total_rows,
COUNT(column_name) AS non_null_count,
COUNT(DISTINCT column_name) AS distinct_count,
MIN(column_name) AS min_val,
MAX(column_name) AS max_val,
AVG(CAST(column_name AS DECIMAL)) AS avg_val -- 數值型
FROM table_name;
public class ColumnStatistics {
public static Map analyzeColumn(Connection conn, String table, String column) throws SQLException {
Map stats = new HashMap<>();
String sql = String.format(
"SELECT COUNT(*), COUNT(%s), COUNT(DISTINCT %s), MIN(%s), MAX(%s) FROM %s",
column, column, column, column, table
);
try (PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
stats.put("total", rs.getLong(1));
stats.put("nonNull", rs.getLong(2));
stats.put("distinct", rs.getLong(3));
stats.put("min", rs.getObject(4));
stats.put("max", rs.getObject(5));
stats.put("nullRate", 1.0 - (double)rs.getLong(2)/rs.getLong(1));
}
}
return stats;
}
}
-- 數值型分桶
SELECT
FLOOR(column_name / 100) * 100 AS bucket,
COUNT(*) AS freq
FROM table_name
GROUP BY bucket
ORDER BY bucket;
-- 字符串型 Top-N
SELECT column_name, COUNT(*) AS freq
FROM table_name
GROUP BY column_name
ORDER BY freq DESC
LIMIT 20;
public void analyzeAllColumns(Connection conn, String table) throws SQLException {
// 獲取所有列信息
DatabaseMetaData meta = conn.getMetaData();
try (ResultSet columns = meta.getColumns(null, null, table, null)) {
while (columns.next()) {
String colName = columns.getString("COLUMN_NAME");
int dataType = columns.getInt("DATA_TYPE");
// 根據類型選擇統計策略
Map stats = analyzeColumn(conn, table, colName);
System.out.printf("%s: %s%n", colName, stats);
}
}
}
TABLESAMPLE (PostgreSQL) 或 SAMPLE (Oracle) 或 WHERE RAND() < 0.01 (MySQL)數據庫字段統計應優先在 SQL 層完成聚合,Java 層負責協調、格式化、緩存。針對大表採用抽樣、異步、緩存策略。若原問題涉及特定業務邏輯(如特定字段組合統計),請提供具體表結構與需求以給出針對性方案。