選讀SQL經典實例筆記08_區間查詢

来源:https://www.cnblogs.com/lying7/archive/2023/07/18/17559800.html
-Advertisement-
Play Games

![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230717125930891-211733509.png) # 1. 計算同一組或分區的行之間的差 ## 1.1. 最終結果集 ### 1.1.1. sql ```sql D ...


1. 計算同一組或分區的行之間的差

1.1. 最終結果集

1.1.1. sql

DEPTNO ENAME             SAL HIREDATE    DIFF
------ ---------- ---------- ----------- ----------
    10 CLARK            2450 09-JUN-1981      -2550
    10 KING             5000 17-NOV-1981       3700
    10 MILLER           1300 23-JAN-1982        N/A
    20 SMITH             800 17-DEC-1980      -2175
    20 JONES            2975 02-APR-1981        -25
    20 FORD             3000 03-DEC-1981          0
    20 SCOTT            3000 09-DEC-1982       1900
    20 ADAMS            1100 12-JAN-1983        N/A
    30 ALLEN            1600 20-FEB-1981        350
    30 WARD             1250 22-FEB-1981      -1600
    30 BLAKE            2850 01-MAY-1981       1350
    30 TURNER           1500 08-SEP-1981        250
    30 MARTIN           1250 28-SEP-1981        300
    30 JAMES             950 03-DEC-1981        N/A

1.1.2. 每個員工的DEPTNO、ENAME和SAL,以及同一個部門(即DEPTNO相同)里不同員工之間的工資差距

1.1.3. 一個部門裡入職日期最晚的那個員工,將其工資差距設置為N/A

1.2. DB2

1.3. PostgreSQL

1.4. MySQL

1.5. SQL Server

1.6. sql

select deptno,ename,hiredate,sal,
         coalesce(cast(sal-next_sal as char(10)),'N/A') as diff
    from (
  select e.deptno,
         e.ename,
         e.hiredate,
         e.sal,
         (select min(sal) from emp d
           where d.deptno=e.deptno
             and d.hiredate =
                  (select min(hiredate) from emp d
                    where e.deptno=d.deptno
                    and d.hiredate > e.hiredate)) as next_sal
    from emp e
         ) x

1.6.2. 使用標量子查詢找出同一個部門裡緊隨當前員工之後入職的員工的HIREDATE

1.6.3. 使用了MIN(HIREDATE)來確保僅返回一個值

1.6.3.1. 即使同一天入職的員工不止一個人,也只會返回一個值

1.6.4. 另一個標量子查詢來找出入職日期等於NEXT_HIRE的員工的工資

1.6.4.1. 使用MIN函數來確保只返回一個值

1.7. Oracle

1.7.1.  sql

select deptno,ename,sal,hiredate,
        lpad(nvl(to_char(sal-next_sal),'N/A'),10) diff
   from (
 select deptno,ename,sal,hiredate,
        lead(sal)over(partition by deptno
                          order by hiredate) next_sal
   from emp
        )

2. 定位連續值區間的開始值和結束值

2.1. 示例

2.1.1. sql

select *
  from V
PROJ_ID PROJ_START  PROJ_END
------- ----------- -----------
      1 01-JAN-2005 02-JAN-2005
      2 02-JAN-2005 03-JAN-2005
      3 03-JAN-2005 04-JAN-2005
      4 04-JAN-2005 05-JAN-2005
      5 06-JAN-2005 07-JAN-2005
      6 16-JAN-2005 17-JAN-2005
      7 17-JAN-2005 18-JAN-2005
      8 18-JAN-2005 19-JAN-2005
      9 19-JAN-2005 20-JAN-2005
     10 21-JAN-2005 22-JAN-2005
     11 26-JAN-2005 27-JAN-2005
     12 27-JAN-2005 28-JAN-2005
     13 28-JAN-2005 29-JAN-2005
     14 29-JAN-2005 30-JAN-2005

2.2. 最終結果集

2.2.1.  sql

PROJ_GRP PROJ_START  PROJ_END
-------- ----------- -----------
       1 01-JAN-2005 05-JAN-2005
       2 06-JAN-2005 07-JAN-2005
       3 16-JAN-2005 20-JAN-2005
       4 21-JAN-2005 22-JAN-2005
       5 26-JAN-2005 30-JAN-2005

2.2.2. 必須明確什麼是區間

2.2.2.1. PROJ_START和PROJ_END的值決定哪些行屬於同一個區間

2.2.2.2. 如果某一行的PROJ_START值等於上一行的PROJ_END值,那麼該行就是“連續”的,或者說它屬於某個組

2.3. DB2

2.4. PostgreSQL

2.5. MySQL

2.6. SQL Server

2.7. sql

create view v2
as
select a.*,
       case
         when (
            select b.proj_id
              from V b
             where a.proj_start = b.proj_end
              )
              is not null then 0 else 1
       end as flag
  from V a

2.7.2.

select proj_grp,
         min(proj_start) as proj_start,
         max(proj_end) as proj_end
    from (
  select a.proj_id,a.proj_start,a.proj_end,
         (select sum(b.flag)
            from V2 b
           where b.proj_id <= a.proj_id) as proj_grp
    from V2 a
         ) x
   group by proj_grp

2.8. Oracle

2.8.1.   sql

select proj_grp, min(proj_start), max(proj_end)
    from (
  select proj_id,proj_start,proj_end,
         sum(flag)over(order by proj_id) proj_grp
    from (
  select proj_id,proj_start,proj_end,
         case when
              lag(proj_end)over(order by proj_id) = proj_start
              then 0 else 1
         end flag
    from V
         )
         )
   group by proj_grp

3. 生成連續的數值

3.1. DB2

3.2. SQL Server

3.3. sql

with x (id)
  as (
  select 1
    from t1
   union all
  select id+1
    from x
   where id+1 <= 10
  )
  select * from x

3.4. Oracle

3.4.1.  sql

with x
 as (
 select level id
   from dual
   connect by level <= 10
 )
 select * from x

3.4.1.1. oracle9i

3.4.1.2. 在WHERE子句中斷之前,行數據會被連續生成出來。Oracle會自動遞增偽列LEVEL的值

3.4.2.  sql

select array id
   from dual
  model
    dimension by (0 idx)
    measures(1 array)
    rules iterate (10) (
      array[iteration_number] = iteration_number+1
    )

3.4.2.1. oracle10g

3.4.2.2. 在MODEL子句解決方案里,有一個顯式的ITERATE命令,該命令幫助生成多行數據

3.5. PostgreSQL

3.5.1.  sql

select id
   from generate_series (1,10) x(id)

3.5.1.1. GENERATE_SERIES函數有3個參數,它們都是數值類型

3.5.1.2. 第一個參數是初始值,第二個參數是結束值,第三個參數是可選項,代表“步長”(每次增加的值)

3.5.1.3. 如果沒有指定第3個參數,則預設每次增加1

3.5.1.4. 傳遞給它的參數甚至可以不是常量

3.5.1.5. sql

select id
  from generate_series(
         (select min(deptno) from emp),
         (select max(deptno) from emp),
         5
       ) x(id)

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

-Advertisement-
Play Games
更多相關文章
  • 本篇談一談單鏈表的改,具體操作就是找到他,然後修改元素即可,上一篇有相關代碼,可以參考。 改函數代碼如下: void Correct(LinkList header, int site_, char letter_) { LinkList q = Search_Site(header,site_); ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 本文是《Java擴展Nginx》系列的第 ...
  • # 網路基礎 ## **網路通信** 1. 概念:兩台設備之間通過網路實現數據傳輸; 2. 網路通信:將數據通過網路從一臺設備傳輸到另一臺設備; 3. java.net包下提供了一系列的類或介面,供程式員使用,完成網路通信; ![](https://img2023.cnblogs.com/blog/ ...
  • ### AQS的定義 ​ 隊列同步器 AbstractQueuedSynchronizer(以下簡稱同步器),是用來構建鎖或者其他同步組件的基礎框架,它使用了一個 int 成員變數表示同步狀態,通過內置的 FIFO 隊列來完成資源獲取線程的排隊工作,併發包的作者(Doug Lea)期望它能夠成為實現 ...
  • 本章將和大家分享 ASP.NET Core SignalR 中的中心篩選器。 本文大部分內容摘自微軟官網:https://learn.microsoft.com/zh-cn/aspnet/core/signalr/hub-filters?view=aspnetcore-7.0 廢話不多說,下麵我們直 ...
  • 1.ReferenceEquals(object o1, object o2): 靜態方法:比較兩個對象的引用,引用相同返回true,否則返回false,同為null是返回true;ReferenceEquals進行值類型比較時總是返回false,因為兩個值類型需要分別裝箱到對象中,是不同的引用 ; ...
  • # shell腳本-Nginx訪問日誌分析 ## 1.原理 > 可以通過/usr/local/nginx/logs/access.log 文件-查看nginx的日誌 > > ``` > [root@localhost scripts]# tail -f /usr/local/nginx/logs/a ...
  • ## 跟運維學 Linux - 01 ### 運維的誕生 運維工程師有很多叫法:系統運維、Linux 工程師、系統管理員... `網管`可以說是運維工程師最早的雛形。在個人電腦未普及時,大家去網吧玩游戲。 玩家:“網關,我的電腦上不了網了” 網管負責維修電腦、維修系統、維護網路設備... ### 互 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...