官方解答|測量摘要卡
官方解答|測量摘要卡
解題目標
輸出 row_count、known_count、total、highest:所有列數、有效 reading 列數、讀值總和(無有效值為 0)、最大有效 reading(無有效值為 NULL)。固定回傳一列,即使來源空表也一樣。
查詢步驟
對整表執行聚合。COUNT 類結果為 0 而不是 NULL;SUM/AVG/MIN/MAX 沒有有效輸入時為 NULL,僅在指定位置補 0。 依序輸出欄位 row_count, known_count, total, highest。最終排序:row_count 升序。
正確性
各階段分別實現指定篩列、數值或分組規則。每個保留項目只貢獻題意要求的次數;未配對、缺值與平手依明文規則處理。最後固定別名及排序,因而得到要求的列數、欄位順序與內容。
NULL 與邊界
NULL 表示缺值,不等於 0 或空字串。WHERE/HAVING 只保留真值,假或未知皆排除;一般等號不匹配 NULL。算術操作數缺值時結果為 NULL,除非題目指定備援規則。COUNT(欄位)、SUM、AVG、MIN、MAX 忽略該欄 NULL;COUNT(*) 計算列數。未要求分組或去重時保留所有重複紀錄。空結果仍須具有指定欄名。 輸出 row_count、known_count、total、highest:所有列數、有效 reading 列數、讀值總和(無有效值為 0)、最大有效 reading(無有效值為 NULL)。固定回傳一列,即使來源空表也一樣。
公開範例
fixture 為 {"tables":[{"name":"readings","columns":[{"name":"id","type":"INTEGER","nullable":false},{"name":"zone","type":"TEXT","nullable":true},{"name":"reading","type":"INTEGER","nullable":true},{"name":"weight","type":"INTEGER","nullable":true},{"name":"flag","type":"INTEGER","nullable":true},{"name":"day","type":"INTEGER","nullable":false},{"name":"label","type":"TEXT","nullable":true}],"rows":[[21,"north",7,null,null,2,"a"],[41,"south",-2,0,1,4,null],[11,"west",null,4,0,2,"beta"],[31,"north",3,2,1,1,"alpha"]]}]}。按題意處理並完成排序後得到 {"columns":["row_count","known_count","total","highest"],"rows":[[4,3,8,7]]}。即使沒有結果列,也必須保留指定欄名。
複雜度
設輸入列數為 n。整體聚合只需掃描資料,參考計算時間 O(n)、額外統計空間 O(1),結果固定一列。實際執行計畫可能使用索引。
三種方言
下方分別提供完整 SQLite、PostgreSQL、MySQL 查詢。文字排序明寫二進位/字元碼排序;本題 ASCII 域中 SQLite LENGTH 對應其他引擎 CHAR_LENGTH。SQL NULL 輸出 JSON null,不輸出文字 "NULL"。
CodeSprout 官方解答 · 題意分析、解題步驟與完整參考程式
MySQL
SELECT row_count AS row_count, known_count AS known_count, total AS total, highest AS highest
FROM (
SELECT COUNT(*) AS row_count, COUNT(reading) AS known_count, COALESCE(SUM(reading),0) AS total, MAX(reading) AS highest
FROM readings
) query_result
ORDER BY row_count ASC;SQLite
SELECT row_count AS row_count, known_count AS known_count, total AS total, highest AS highest
FROM (
SELECT COUNT(*) AS row_count, COUNT(reading) AS known_count, COALESCE(SUM(reading),0) AS total, MAX(reading) AS highest
FROM readings
) query_result
ORDER BY row_count ASC;PostgreSQL
SELECT row_count AS row_count, known_count AS known_count, total AS total, highest AS highest
FROM (
SELECT COUNT(*) AS row_count, COUNT(reading) AS known_count, COALESCE(SUM(reading),0) AS total, MAX(reading) AS highest
FROM readings
) query_result
ORDER BY row_count ASC;
留言討論 0
登入 後就能留言,一起討論不同的寫法。