標籤:

Oracle資料庫在違章表裡面,怎麼找出30天內違章大於3次的人?

這題用到欄位sfzh(身份證號),xm(姓名),wfsj(違法時間),30天內是只任意30天,如2月5號+30天之間,大家現在給的答案都不對啊!


1、where 30天內

2、select 人, count(*) as shit group by 人

3、where shit &> 3

每天0點運行一次,記錄下來


第一步,把表打開

第二步,從第一條數據開始,用你的24K氪金狗眼往下掃,發現違章的就在本子上記下車牌號,再記一個1,如果本子上已經有了,那就把對應的數字加1。

第三步,掃完這張表後,看看本子上數字大於3的,把車牌號摘出來。

把表合上

大功告成!

什麼?我蒙你?不要亂說啊,我這方法在專業術語里叫做「全表掃描」,雖然效率不太高,但很有用的。


你要實現30天內的滑動窗口還是要用子查詢

Select distinct sfzh from t t1 where 3 &< (select count(*) from t t2 where t1.sfzh = t2.sfzh and t1.wfsj - t2.wfsj &< 30 )

聚合加子查詢是經典的很難優化的語句。


關鍵詞:count,group by, having


select 人,count(*) 次數 from 違章表 group by 人 having 次數&> 3

題主,你自己不說清楚,讓我猜嗎


取系統時間。

然後+30天內的。

count,group by,having


select sfzh,xm

from

(select sfzh,xm,wfsj,

lag(wfsj,2) over (partition by sfzh order by wfsj) as 兩次前違法時間

from 違章表)

where wfsj-兩次前違法時間&<=30


這種問題有必要來知乎問嗎?現在的年輕人啊!


題自己做!!!


這裡成百度了?


連個表結構都不給就問查詢語句怎麼寫除了題主也是沒sei了


表結構到底有多複雜才導致題主來知乎問?


也是搞六合一庫的吧,新手啊


以上是結果。

思路是:每個用戶按違章時間大小升序排列。結果要求三個及以上的違章時間在三十天內。那就選最低條件30天。某條記錄如果往後找的第三條時間還是在30天內。該用戶既符合。

實現:表數據自關聯。序號差為3的記錄,如果時間差在30天內,即符合。


簡單粗暴,對日期做一個loop,每一個loop裡面count數大於3的保存起來,然後merge成一張表。


1.篩選人 where 人

2.篩選時間 where 30天內

3.group by進行統計


第一次遇見問的這麼認真又答的這麼認真的題目。。。

不一定要從SQL的角度去解決啊。。

看一下歷史數據。。。

寫一條循環 身份證少的 就用身份證循環 日期少的就用日期循環 找30天咯

最後正經的說 可以使用一下開窗函數 使用方法自己百度。然而任何一種解法 如果數據量巨大的話 也是要跪的


已經發現了漏洞…… 遇到第一條或者最後一條有時間相同的數據的時候 會查不到……

這如何縮進成比較方便看的啊 空格看起來不齊 …… 怕被強迫症砍啊

select distinct a.sfzh

from t_table a, t_table b

where a.pk_t_table &<&> b.pk_t_table

and abs(a.wfsj - b.wfsj) &<= 30

and a.wfsj &<&> b.wfsj

and a.sfzh = b.sfzh

and exists (select c.sfzh

from t_table c

where c.sfzh = a.sfzh

and c.pk_t_table &<&> a.pk_t_table

and c.pk_t_table &<&> b.pk_t_table

and c.wfsj between a.wfsj and b.wfsj

group by c.sfzh

having count(c.sfzh) &> 1);

我沒有用時間來判斷是否是一次違章,用的是違章表的主鍵來判斷。我不知道是否存在同一時間兩次或者多次違章的情況。我是將這種情況算成多次違章的…如果這種算一次,把主鍵換成違章時間即可(有一個前提是時間精度應該到分甚至更高)

這個sql在我這邊的容災環境查詢得到的結果,我找了十幾個驗證沒啥問題。

另外我原語句欄位當然不是上面的- -

該表20W數據 執行效率如下

歡迎各路大神指教其中的錯誤~ 或者提出優化方案~

謝謝


時間轉換成utc然後數字範圍><就可以搞定


select

DISTINCT 身份證號,姓名

from

(select 身份證號,姓名,違法時間 from 表 TB_A

inner join 表 TB_B

on TB_A.身份證號 =TB_B.身份證號

and TB_B.違法時間 between TB_A.違法時間 and TB_A.違法時間+30

group by TB_A.身份證號,TB_A.姓名,TB_A.違法時間 HAVING COUNT(*)&>3) TB_C


推薦閱讀:

Python3 pandas如何加快SQL Server讀寫速度?
請教一個SQL,詳情請看問題補充?
為什麼用SQL而不是Excel+VBA?
sql中為什麼select要放在from之前?
如何優雅地寫SQL?

TAG:SQL | IT行業 |