Oracle
從包含重複項的 oracle 表中選擇和匯總數據
我有一個包含數據的表,其中一些在給定列中相同但在其他列中不同。我將嘗試將此表描述為以下內容:
表 1 表 2 表 3 +---+------+-----+----------+-----+ +-----+------+ +------------------+ | id|sub_id|區塊|區塊日期|有效| | id |活躍| |rec_id| 消息ID | |---+------+-----+----------+-----+ +-----+------+ +-------+----------+ |123|123_1 | 0 | |假| | 123 | 1 | | 123 |a123kckcdf| |123|123_2 | 0 | |假| | 321 | 1 | | 123 |ffsw2234sd| |123|123_3 | 1 |01.07.2019|真 | | 第456章 0 | | 123 | kk3jd563sf| |321|321_1 | 1 |28.06.2019|真 | | 第654章 1 | | 654 |89hhrlidlf| |321|321_2 | 0 | |假| +-----+-----+ | 第456章 |456|451_1 | 0 | |假| | 第321章 |456|456_1 | 0 | |假| | 123 |jdjd234lds| |654|654_1 | 0 | |真 | | 第654章 |654|654_2 | 1 |01.04.2017|真 | | 第453章 +---+------+-----+----------+-----+ +-------+----------+
這是我想要實現的:
匯總發送到 rec_id IF 的記錄數:
Block_date 必須在 24 小時前發生(假設我將在 ‘01.07.2019’ 執行此查詢)
table1、table2和table3中rec_id中的值’id’相同(可以在join中使用)
對於所有出現的 sub_id,table1 中“valid”的值可以為“false”(在應用程序 gui 中錯誤地手動設置)
table1 中“blacklisted”的值必須為 ‘1’
table2中“active”的值必須是'1’
table1 中“block date”中的時間確實是時間戳格式並且沒有被截斷(就像在這個例子中一樣)
table3 中的每條消息都是唯一的消息
然後我想最終得到一個這樣的列表:
+---------------------+ | 身份證 | 消息數量 | +------+--------------+ | 321 | 1 | | 654 | 2 | +------+--------------+
我已經嘗試過這樣的事情,但我還沒有設法掌握日期期間,也沒有如何完全應對 table1 中的記錄既可以是有效的又可以是假的,我只想要假的
SELECT t3.rec_id AS"Id", COUNT(t3.rec_id) AS"Num messages" FROM TABLE3 t3 INNER JOIN TABLE2 t2 ON t2.id=t3.rec_id INNER JOIN TABLE1 t1 ON t2.id=t1.id WHERE t2.active='1' AND t1.block='0' AND t1.valid like 'false' GROUP BY t3.rec_id ORDER BY COUNT (t3.rec_id) DESC
(這是為了檢測我們現有常式未檢測到的錯誤消息)
你幾乎是對的,只需在下面添加 24 小時的日期檢查。
SELECT t3.rec_id AS"Id", COUNT(t3.rec_id) AS"Num messages" FROM TABLE3 t3 INNER JOIN TABLE2 t2 ON t2.id=t3.rec_id INNER JOIN TABLE1 t1 ON t2.id=t1.id WHERE t2.active='1' AND t1.block='0' AND t1.valid like 'false' **AND t1.block_date < sysdate - 1** GROUP BY t3.rec_id ORDER BY COUNT (t3.rec_id) DESC
試試這個:
SELECT T1.ID, COUNT(1) FROM TABLE1 T1 JOIN TABLE2 T2 ON ( T1.ID = T2.ID ) JOIN TABLE3 T3 ON ( T2.ID = T3.REC_ID ) WHERE T1.BLOCK_DATE < DATE '2019-07-01' - 1 AND T1.BLOCK = 1 AND T2.ACTIVE = 1 GROUP BY T1.ID
輸出
乾杯!!