用SQL解決兩道有趣的題(一)
Oracle的SQL語句功能還是很強的,看到兩道比較有趣的題,用SQL來嘗試求解。
第一個問題:
已知兩個1~30之間的數字,甲知道兩數之和,乙知道兩數之積。
甲問乙:"你知道是哪兩個數嗎?"乙說:"不知道";
乙問甲:"你知道是哪兩個數嗎?"甲說:"也不知道";
於是,乙說:"那我知道了";
隨後甲也說:"那我也知道了";
這兩個數是什麼?
先給出SQL解,然後簡單描述一下。
這道題分兩種情況,兩個數不重複,那麼有兩個可能結果:
SQL> WITH
2 T AS
3 (SELECT ROWNUM NUM FROM DUAL CONNECT BY LEVEL <= 30)
4 SELECT A, B
5 FROM
6 (
7 SELECT
8 A,
9 B,
10 TOTAL,
11 MUL,
12 COUNT(*) OVER (PARTITION BY MUL) MUL_P
13 FROM
14 (
15 SELECT
16 A,
17 B,
18 TOTAL,
19 MUL,
20 COUNT(*) OVER (PARTITION BY TOTAL) TOTAL_P
21 FROM
22 (
23 SELECT
24 A.NUM A,
25 B.NUM B,
26 A.NUM + B.NUM TOTAL,
27 A.NUM * B.NUM MUL,
28 COUNT(*) OVER (PARTITION BY A.NUM * B.NUM) MUL_P
29 FROM T A, T B
30 WHERE A.NUM < B.NUM
31 )
32 WHERE MUL_P != 1
33 )
34 WHERE TOTAL_P != 1
35 )
36 WHERE MUL_P = 1
37 ;
A B
---------- ----------
1 6
1 8
如果兩個數是可以重複的,那麼有唯一的答案:
SQL> WITH
2 T AS
3 (SELECT ROWNUM NUM FROM DUAL CONNECT BY LEVEL <= 30)
4 SELECT A, B
5 FROM
6 (
7 SELECT
8 A,
9 B,
10 TOTAL,
11 MUL,
12 COUNT(*) OVER (PARTITION BY MUL) MUL_P
13 FROM
14 (
15 SELECT
16 A,
17 B,
18 TOTAL,
19 MUL,
20 COUNT(*) OVER (PARTITION BY TOTAL) TOTAL_P
21 FROM
22 (
23 SELECT
24 A.NUM A,
25 B.NUM B,
26 A.NUM + B.NUM TOTAL,
27 A.NUM * B.NUM MUL,
28 COUNT(*) OVER (PARTITION BY A.NUM * B.NUM) MUL_P
29 FROM T A, T B
30 WHERE A.NUM <= B.NUM
31 )
32 WHERE MUL_P != 1
33 )
34 WHERE TOTAL_P != 1
35 )
36 WHERE MUL_P = 1
37 ;
A B
---------- ----------
1 4
下面簡單描述一下思路:
WITH語句就是構造一張基礎資料表。
最內層的迴圈構造兩個數的笛卡兒積,列出所有的可能,不過對於我們來說,A取1,B取2和A取2,B取1沒有區別,因此加上限制條件A > B。上面兩個SQL唯一的區別就在這裡,如果兩個數是可以重複的那麼A >= B,否則A > B。
迴圈中的分析函式用來計算A和B乘積相同的個數,如果這個數是1,說明這兩個數是可以確定的。而根據乙的描述,他並不知道這兩個數是什麼,因此這部分應該是可以被排除的。
第二層的迴圈道理相同,這裡排除的是A所不知道的,兩個數和能確定這兩個數的部分。
到了第三層,乙知道A和B是什麼數了,說明這個時候A和B的積已經是唯一的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-82468/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一道很有趣的拓撲題
- 分享一道有趣的 Leetcode 題目LeetCode
- 一道有趣的golang排錯題Golang
- 兩款工具解決SQL Server遷移問題DJSQLServer
- 一道小學數學題的解決
- 用SQL解決有向圖問題(轉)SQL
- 價值 100 RMB 的一道 SQL 題SQL
- 使用 AI 解決一道演算法題AI演算法
- 有趣的ES:解決es返回結果數量限制問題
- sql多參問題解決SQL
- 一個有趣的this指向問題
- 一個有趣的鎖問題
- 記一個有趣的數學題
- 什麼是 Flink SQL 解決不了的問題?SQL
- 【SpringMVC】解決跨域問題的兩種方式SpringMVC跨域
- 一次非常有趣的 SQL 優化經歷SQL優化
- 一次非常有趣的sql優化經歷SQL優化
- SQL面試題一道(偏實際業務)SQL面試題
- 雜題隨筆 10.31 兩道LIS相關的題
- 用Python解決一個等差數列的求和問題Python
- 你與寫的一手好sql的大佬可能就差這一道題!SQL
- 01分數規劃的兩道例題
- 如何捕獲問題SQL解決過度CPU消耗的問題SQL
- 【OracleEBS】 訂單暫掛問題sql解決OracleSQL
- Spark SQL中出現 CROSS JOIN 問題解決SparkSQLROS
- 面試三輪我倒在了一道sql題上——sql效能優化面試SQL優化
- 教你兩招解決EOS CPU短缺問題
- 從兩道面試題說起面試題
- SQL經典練習題48道之一(1-10)SQL
- 每日一道演算法題:1.兩數之和演算法
- sql一關聯多查詢時否定篩選出現的問題的解決SQL
- Go的http庫處理multipart的兩個問題解決GoHTTP
- 用程式消除一道概率題的二義性
- 每日"兩"題 題解
- 2024/9/10+11 分塊雜題三道 + 縫合題兩道
- SQL隱碼攻擊問題以及解決方法SQL
- 微服務閘道器 gateway 跨域問題解決微服務Gateway跨域
- 這15道MySQL面試題,解決了90%的面試官MySql面試題
- (xml中sql語句為紅)解決No data sources are configured to run this SQL and provide advanced的問題XMLSQLIDE