Oracle資料庫在違章表裡面,怎麼找出30天內違章大於3次的人?
01-13
這題用到欄位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,havingselect sfzh,xmfrom (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) &<= 30and 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然後數字範圍><就可以搞定
selectDISTINCT 身份證號,姓名from(select 身份證號,姓名,違法時間 from 表 TB_Ainner join 表 TB_Bon TB_A.身份證號 =TB_B.身份證號and TB_B.違法時間 between TB_A.違法時間 and TB_A.違法時間+30group by TB_A.身份證號,TB_A.姓名,TB_A.違法時間 HAVING COUNT(*)&>3) TB_C
推薦閱讀:
※Python3 pandas如何加快SQL Server讀寫速度?
※請教一個SQL,詳情請看問題補充?
※為什麼用SQL而不是Excel+VBA?
※sql中為什麼select要放在from之前?
※如何優雅地寫SQL?