基于時序下的進(jìn)出記錄匹配和數(shù)據(jù)去重

時序下進(jìn)出記錄匹配說明

需求說明

一個人至少管理1個工地;每天至少要去一個自己管理的工地;該人員沒有固定上下班時間;統(tǒng)計一個人的月度工地出勤績效情況。???

績效考核標(biāo)準(zhǔn):

?????? (1)每天工地工作時長不小于m小時,則達(dá)標(biāo);

?????? (2)每個月所有工地工作時長總和不小于n天,則達(dá)標(biāo);

?????? (3)每月該人管理的所有工地都有出勤記錄的才達(dá)標(biāo),有工地未出勤的績效不達(dá)標(biāo);

?????? (4)只有滿足上述條件的績效才達(dá)標(biāo);否則,不達(dá)標(biāo)。

其中,夜班加班的分割處理,分割部分計入當(dāng)天統(tǒng)計。

現(xiàn)只能通過提供的進(jìn)出記錄,判斷月度出勤績效情況。

問題描述

硬件上報讀卡進(jìn)出記錄的問題說明:

?????? c-1.進(jìn)或者出記錄的時間時長問題:若人員經(jīng)電感線圈激活卡片,但在該激活區(qū)域停留了一段時間,這種情況下的時間是哪一個?

?????? c-2.硬件設(shè)備如何保證按照時間順序進(jìn)出記錄完整匹配的情況?

?????? c-3.假如無法保證時序下數(shù)據(jù)的完整性,是否可以降低不完整的情況,少量數(shù)據(jù)異常標(biāo)識處理?

?????? ??? 時序下的進(jìn)出記錄隊列可能情況很多,這里羅列部分:

????????????? 偶數(shù)隊列長度情況,

????????????? (1)進(jìn)出進(jìn)出進(jìn)出

????????????? (2)出進(jìn)出進(jìn)出進(jìn)

????????????? (3)出出進(jìn)出進(jìn)進(jìn)

????????????? (4)進(jìn)進(jìn)出出進(jìn)出

????????????? 奇數(shù)隊列長度情況,

????????????? (1)進(jìn)出進(jìn)出進(jìn)出進(jìn)

????????????? (2)出進(jìn)出進(jìn)出進(jìn)出

????????????? (3)出出進(jìn)進(jìn)出進(jìn)進(jìn)

????????????? (4)進(jìn)進(jìn)出出進(jìn)出出

? 這樣的組合太多,不再一一羅列,如果上述無法保證時序下數(shù)據(jù)完整匹配的情況,則考核的報表無法保證真實可靠性。

問題分析

要解決上述需求,必須要匹配下列要素。

(1)? ? 月度時序;

(2)? ? 日期匹配;

(3)? ? 項目地人員、日期匹配;

(4)? ? 項目地進(jìn)出記錄匹配;

月度時序問題

假如,某人某天未去他管理的項目地,則無進(jìn)出記錄,在sql 后,查詢不到該天日期,會造成該月日期中斷。

怎么解決因查詢無進(jìn)出記錄造成的月日期時序中斷的情況?

a.???存儲過程調(diào)用

這里不再贅述。

b.???sql變量控制

指定數(shù)據(jù)條數(shù),生成連續(xù)的數(shù)字或日期。

涉及到的知識點是變量,DATE_SUB(),DATE_FORMAT().使用以上方法的好處就是不用創(chuàng)建存儲過程,也不涉及到任何表。缺點就是數(shù)據(jù)的條數(shù)控制并不靈活,不能和用戶之間形成互動,即不能自定義日期區(qū)間,只能控制數(shù)據(jù)條數(shù)。

c.??利用現(xiàn)有含日期時間的表

要求是這個表中的數(shù)據(jù)足夠龐大,好處是不涉及存儲過程,不涉及變量,且能自定義日期區(qū)間。

綜合考慮,使用存儲過程調(diào)用。

mysql 存儲過程調(diào)用

可以理解為建立標(biāo)準(zhǔn)日期時間表。

step1.創(chuàng)建存儲過程

CREATE PROCEDURE createDate()

BEGIN

?????? DECLAREindexdate DATE;

?????? setindexdate = DATE('2019-01-01');

WHILE indexdate<=DATE('2020-01-01')

? DO

???????????????????? INSERTinto? ts_date(date) VALUES(indexdate);

???????????????????? setindexdate = ADDDATE(indexdate,1);

end WHILE;

END;

Step2.存儲過程調(diào)用

CALL createDate();

日期匹配問題

這里可以這么處理

(1)? ?根據(jù)月度時序中的表來補(bǔ)全日期,

(2)? ?再根據(jù)日期來查詢進(jìn)出記錄,

(3)? ?根據(jù)卡號過濾人員,

(4)? ?根據(jù)記錄中的處理機(jī)設(shè)備編號來區(qū)分項目地。

這里就不存在問題了。

項目地匹配問題

設(shè)備和項目地綁定,這里可以這樣處理

(1)? ? 根據(jù)處理機(jī)設(shè)備來區(qū)分項目地

(2)? ? 根據(jù)記錄中上報的卡號識別人員信息

這里也不存在問題。

項目地進(jìn)出記錄匹配問題

上報數(shù)據(jù)中有時間、人員卡號、處理機(jī)編號、進(jìn)出狀態(tài)標(biāo)識,滿足匹配條件。

但是,因為意外造成的進(jìn)出記錄不匹配,會對報表統(tǒng)計造成致命錯誤。

因此這里重點說明下因為異常造成的數(shù)據(jù)匹配問題。

匹配模式

正常的匹配模式有下列幾種:

1.? ? ABAB

2.? ? BABA

3.? ? ABABA

4.? ? BABAB

5.? ? A

6.? ? B

其它的均為異常情況;

基于此,提供基本匹配算法。

基本思路:

(1)? ?匹配要素為A(進(jìn))B(出)

(2)? ?根據(jù)需要匹配的數(shù)據(jù)長度構(gòu)造上述6種匹配模式下的正確匹配數(shù)據(jù)組

(3)? ?篩選符合條件的數(shù)據(jù),重組新的數(shù)據(jù)組并標(biāo)識不匹配的數(shù)據(jù)到源數(shù)據(jù)組

構(gòu)造匹配數(shù)據(jù)組方法如下:


構(gòu)造匹配數(shù)據(jù)

構(gòu)建滿足匹配模式的數(shù)據(jù)并標(biāo)識原始數(shù)據(jù)匹配情況的方法如下:


數(shù)據(jù)匹配及源數(shù)據(jù)標(biāo)識

上述完成后,只需要解決數(shù)據(jù)的重發(fā)問題即可。

(1)? ? 數(shù)據(jù)重發(fā)問題,需要根據(jù)實際設(shè)備驗證。

(2)? ? 跨多天工作的情況:實際情況下會很少發(fā)生,上述計算時長均分割到當(dāng)天和前天,這樣理論上會造成實際時長缺失。建議配合提供管理制度解決。

最終標(biāo)記

數(shù)據(jù)去重

因為是根據(jù)時間去重的,記錄有進(jìn)出之分,且進(jìn)出需要考核時長,因此需要根據(jù)客戶要求靈活控制去重時間和保留進(jìn)出記錄的哪一種。

去重
驗證


true


false
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容