Oracle

從包含重複項的 oracle 表中選擇和匯總數據

  • March 11, 2022

我有一個包含數據的表,其中一些在給定列中相同但在其他列中不同。我將嘗試將此表描述為以下內容:

表 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

輸出

在此處輸入圖像描述

db<>小提琴展示

乾杯!!

引用自:https://dba.stackexchange.com/questions/241795