跳至內容
Astera Technology

同一人掃碼兩次,出席人數會否多計?

每節課每人只計一次出席,但原掃碼事件仍保留供查核。

下載完整個案資料及參考答案 ↓

先準備用來排查的資料

一筆掃碼是登記事件,不一定是另一位出席者。每節課計不重複會員編號,同一人去另一節則再次計。若整個匯出只按會員去重,會少計之後的課節。

以下完整建表及資料只在新的 SQLite 測試資料庫執行。全部紀錄均為假設,數量以件計,輸入的 cents 金額欄以貨幣的分存整數;計算後的平均數可能不足整分。小型例子的各表均完整列在預覽。

假設輸入:scans
編號課節編號會員編號
1AM1
2AM1
3AM2
4BM1
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE scans(id INTEGER PRIMARY KEY,session_id TEXT,member_id TEXT);
INSERT INTO scans VALUES (1,'A','M1'),(2,'A','M1'),(3,'A','M2'),(4,'B','M1');

重現錯誤結果,再核對更正

錯誤示範查詢:只用來重現問題
SELECT session_id,COUNT(*) AS attendees FROM scans GROUP BY session_id ORDER BY session_id;
實際執行的錯誤示範結果
課節編號出席人數
A3
B1
下載可編輯 CSV ↓
更正後的 SQLite 查詢
SELECT session_id,COUNT(DISTINCT member_id) AS attendees FROM scans GROUP BY session_id ORDER BY session_id;
更正查詢的實際結果
課節編號出席人數
A2
B1
下載可編輯 CSV ↓

A 有三次掃碼,但只有兩人;B 有一人。更正後是兩人及一人。M1 的重複掃碼仍保留,可再查是裝置重試還是同事更正。

套用前先測邊界及資料範圍

A 再加入 M1 的掃碼,人數仍是兩人;若是新會員才增加,所以識別是會員加課節,不是事件數。

邊界測試要另開新的假設資料庫,重做完整建表及資料,只套用以下改動,再執行更正查詢。測試改動不可用於正式系統。

新假設副本內的邊界改動
INSERT INTO scans VALUES (5,'A','M1');
改動後再執行更正查詢的實際結果
課節編號出席人數
A2
B1
下載可編輯 CSV ↓

空會員編號會被 COUNT(DISTINCT) 略過,須另查;離場及缺席規則未包括在內。

以上錯誤、更正及邊界結果都已在 SQLite 執行,並與另行編寫的預期資料逐行核對。證據只適用於這組假設條件,未測其他資料庫、正式效能或你的現有資料結構。

相關資源