讀SQL進階教程筆記08_處理數列

来源:https://www.cnblogs.com/lying7/archive/2023/04/05/17283512.html
-Advertisement-
Play Games

1. 處理有序集合也並非SQL的直接用途 1.1. SQL語言在處理數據時預設地都不考慮順序 2. 處理數據的方法有兩種 2.1. 第一種是把數據看成忽略了順序的集合 2.2. 第二種是把數據看成有序的集合 2.2.1. 首先用自連接生成起點和終點的組合 2.2.2. 其次在子查詢中描述內部的各個元 ...


1. 處理有序集合也並非SQL的直接用途

1.1. SQL語言在處理數據時預設地都不考慮順序

2. 處理數據的方法有兩種

2.1. 第一種是把數據看成忽略了順序的集合

2.2. 第二種是把數據看成有序的集合

2.2.1. 首先用自連接生成起點和終點的組合

2.2.2. 其次在子查詢中描述內部的各個元素之間必須滿足的關係

2.2.2.1. 要在SQL中表達全稱量化時,需要將全稱量化命題轉換成存在量化命題的否定形式,並使用NOT EXISTS謂詞

3. 生成連續編號

3.1. 序列對象(sequence object)

3.1.1. CONNECT BY(Oracle)

3.1.2. WITH子句(DB2、SQL Server)

3.1.3. 依賴資料庫實現的方法

3.2. 示例

3.2.1.

3.2.1.1. --求連續編號(1):求0~99的數

    SELECT D1.digit + (D2.digit * 10)  AS seq
      FROM Digits D1 CROSS JOIN Digits D2
     ORDER BY seq;

3.2.1.2. --求連續編號(2):求1~542的數

    SELECT D1.digit + (D2.digit * 10) + (D3.digit * 100) AS seq
      FROM Digits D1 CROSS JOIN Digits D2
            CROSS JOIN Digits D3
     WHERE D1.digit + (D2.digit * 10)
                    + (D3.digit * 100) BETWEEN 1 AND 542
     ORDER BY seq;

3.2.1.3. --生成序列視圖(包含0~999)

    CREATE VIEW Sequence (seq)
    AS SELECT D1.digit + (D2.digit * 10) + (D3.digit * 100)
        FROM Digits D1 CROSS JOIN Digits D2
                CROSS JOIN Digits D3;
3.2.1.3.1. --從序列視圖中獲取1~100
    SELECT seq
      FROM Sequence
     WHERE seq BETWEEN 1 AND 100
     ORDER BY seq;

3.3. 馮·諾依曼的方法使用遞歸集合定義自然數,先定義0然後得到1,定義1然後得到2,是有先後順序的

3.3.1. 適用於解決位次、累計值等與順序相關的問題

3.4. 這裡的解法完全丟掉了順序這一概念,僅把數看成是數字的組合。這種解法更能體現出SQL語言的特色

4. 求全部的缺失編號

4.1. 示例

4.1.1. --EXCEPT版

    SELECT seq
      FROM Sequence
     WHERE seq BETWEEN 1 AND 12
    EXCEPT
    SELECT seq FROM SeqTbl;

4.1.1.1. --NOT IN版

    SELECT seq
      FROM Sequence
     WHERE seq BETWEEN 1 AND 12
      AND seq NOT IN (SELECT seq FROM SeqTbl);

4.1.2. --動態地指定連續編號範圍的SQL語句

    SELECT seq
      FROM Sequence
     WHERE seq BETWEEN (SELECT MIN(seq) FROM SeqTbl)
                  AND (SELECT MAX(seq) FROM SeqTbl)
    EXCEPT
    SELECT seq FROM SeqTbl;

4.1.2.1. 查詢上限和下限未必固定的表時非常方便

4.1.2.2. 兩個自查詢沒有相關性,而且只會執行一次

4.1.2.3. 如果在“seq”列上建立索引,那麼極值函數的運行可以變得更快速

5. 座位預訂

5.1. 三個人能坐得下嗎

5.1.1.

5.1.1.1. --找出需要的空位(1):不考慮座位的換排

    SELECT S1.seat   AS start_seat, '~', S2.seat AS end_seat
      FROM Seats S1, Seats S2
     WHERE S2.seat = S1.seat + (:head_cnt -1)  --決定起點和終點
      AND NOT EXISTS
              (SELECT *
                FROM Seats S3
                WHERE S3.seat BETWEEN S1.seat AND S2.seat
                  AND S3.status <>’未預訂’);
5.1.1.1.1. “:head_cnt”是表示需要的空位個數的參數
5.1.1.1.2. 如果不減1,會多取一個座位

5.1.1.2. 第一步:通過自連接生成起點和終點的組合

5.1.1.2.1. S2.seat = S1.seat + (:head_cnt-1)的部分
5.1.1.2.2. 排除掉了像1~8、2~3這樣長度不是3的組合

5.1.1.3. 第二步:描述起點到終點之間所有的點需要滿足的條件

5.1.1.3.1. 序列內的點需要滿足的條件“所有座位的狀態都是‘未預訂’”

5.1.1.4. --找出需要的空位(2):考慮座位的換排

    SELECT S1.seat   AS start_seat, '~', S2.seat AS end_seat
      FROM Seats2 S1, Seats2 S2
     WHERE S2.seat = S1.seat + (:head_cnt -1)  --決定起點和終點
      AND NOT EXISTS
              (SELECT *
                FROM Seats2 S3
                WHERE S3.seat BETWEEN S1.seat AND S2.seat
                  AND (    S3.status <>’未預訂’
                        OR S3.row_id <> S1.row_id));
5.1.1.4.1. 所有座位的狀態都是‘未預訂’,且行編號相同

5.2. 最多能坐下多少人

5.2.1.

5.2.1.1. 條件1:起點到終點之間的所有座位狀態都是“未預訂”

5.2.1.2. 條件2:起點之前的座位狀態不是“未預訂”

5.2.1.3. 條件3:終點之後的座位狀態不是“未預訂”

5.2.2. --第一階段:生成存儲了所有序列的視圖

    CREATE VIEW Sequences (start_seat, end_seat, seat_cnt) AS
    SELECT S1.seat  AS start_seat,
          S2.seat  AS end_seat,
          S2.seat - S1.seat + 1 AS seat_cnt
      FROM Seats3 S1, Seats3 S2
     WHERE S1.seat <= S2.seat  --第一步:生成起點和終點的組合
        AND NOT EXISTS    --第二步:描述序列內所有點需要滿足的條件
            (SELECT *
              FROM Seats3 S3
              WHERE (     S3.seat BETWEEN S1.seat AND S2.seat
                      AND S3.status <>’未預訂’)  --條件1的否定
                OR  (S3.seat = S2.seat + 1 AND S3.status =’未預訂’)
                                                        --條件2的否定
                OR  (S3.seat = S1.seat -1 AND S3.status =’未預訂’));
                                                        --條件3的否定

5.2.2.1. --第二階段:求最長的序列

    SELECT start_seat, '~', end_seat, seat_cnt
      FROM Sequences
     WHERE seat_cnt = (SELECT MAX(seat_cnt) FROM Sequences);

6. 單調遞增和單調遞減

6.1. 示例

6.1.1.

6.1.2. --生成起點和終點的組合的SQL語句

    SELECT S1.deal_date  AS start_date,
          S2.deal_date  AS end_date
      FROM MyStock S1, MyStock S2
     WHERE S1.deal_date < S2.deal_date;

6.1.2.1. --求單調遞增的區間的SQL語句:子集也輸出

    SELECT S1.deal_date   AS start_date,
          S2.deal_date   AS end_date
      FROM MyStock S1, MyStock S2
     WHERE S1.deal_date < S2.deal_date  --第一步:生成起點和終點的組合
      AND  NOT EXISTS
              ( SELECT *  --第二步:描述區間內所有日期需要滿足的條件
                  FROM MyStock S3, MyStock S4
                  WHERE S3.deal_date BETWEEN S1.deal_date AND S2.deal_date
                  AND S4.deal_date BETWEEN S1.deal_date AND S2.deal_date
                    AND S3.deal_date < S4.deal_date
                    AND S3.price >= S4.price);
6.1.2.1.1. --排除掉子集,只取最長的時間區間
    SELECT MIN(start_date) AS start_date,      --最大限度地向前延伸起點
          end_date
      FROM  (SELECT S1.deal_date AS start_date,
                    MAX(S2.deal_date) AS end_date  --最大限度地向後延伸終點
              FROM MyStock S1, MyStock S2
              WHERE S1.deal_date < S2.deal_date
                AND NOT EXISTS
                (SELECT *
                    FROM MyStock S3, MyStock S4
                  WHERE S3.deal_date BETWEEN S1.deal_date AND S2.deal_date
                    AND S4.deal_date BETWEEN S1.deal_date AND S2.deal_date
                    AND S3.deal_date < S4.deal_date
                    AND S3.price >= S4.price)
            GROUP BY S1.deal_date) TMP
    GROUP BY end_date;

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前編 一般來說, 泛型的作用就類似一個占位符, 或者說是一個參數, 可以讓我們把類型像參數一樣進行傳遞, 儘可能地復用代碼 我有個朋友, 在使用的過程中發現一個問題 IFace<object> item = new Face<string>(); // CS0266 public interface ...
  • Intro EF Core支持多種方式處理具有繼承關係的表,現在支持TPH、TPC(EF Core 7)、TPT,具體的實現方式可以參考官方文檔和這篇文章。 大致總結一下不同的方式的區別: TPH:所有的類型都放在一張表中,使用discriminator欄位用以區別不同的類型 TPT:不同的子類型有 ...
  • 作者:袁首京 原創文章,轉載時請保留此聲明,並給出原文連接。 如果您是電腦相關從業人員,那麼應該經歷不止一次網路安全專項檢查了,你肯定是收到過信息系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ...
  • 1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從巨集觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用於零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ...
  • 1、虛擬化平臺虛擬機添加硬碟 系統查看添加的硬碟 [root@yumserver ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8: ...
  • 1. 按照現在的SQL標準來說,HAVING子句是可以單獨使用的 1.1. 就不能在SELECT子句里引用原來的表裡的列了 1.1.1. 使用常量 1.1.2. 使用聚合函數 1.2. WHERE子句用來調查集合元素的性質,而HAVING子句用來調查集合本身的性質 2. 表不是文件,記錄也沒有順序, ...
  • MySQL explain 和 profiling 詳解 mysql explain MySQL 的 EXPLAIN 是一個用於查詢優化的工具,它可以顯示 MySQL 資料庫如何執行查詢。它返回一組關於查詢執行計劃的信息,包括用到的索引,表的連接順序以及 MySQL 使用的查詢類型。下麵是 EXPL ...
  • 優質博文:IT-BLOG-CN 一、binlog binlog記錄資料庫表結構和表數據變更,比如update/delete/insert/truncate/create,它不會記錄select。存儲著每條變更的SQL語句和XID事務Id等等。binlog日誌文件如下: [[email protected] ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...