Hsql每日一題 | day03

前言

就一直向前走吧,沿途的花終將綻放~

題目:打折日期交叉問題

如下為平臺商品促銷數據:字段為品牌,打折開始日期,打折結束日期
brand stt        edt
oppo,2021-06-05,2021-06-09
oppo,2021-06-11,2021-06-21
vivo,2021-06-05,2021-06-15
vivo,2021-06-09,2021-06-21
redmi,2021-06-05,2021-06-21
redmi,2021-06-09,2021-06-15
redmi,2021-06-17,2021-06-26
huawei,2021-06-05,2021-06-26
huawei,2021-06-09,2021-06-15
huawei,2021-06-17,2021-06-21計算每個品牌總的打折銷售天數,注意其中的交叉日期,比如 vivo 品牌,
第一次活動時間為 2021-06-05 到 2021-06-15,第二次活動時間為 2021-06-09 到 2021-06-21 其中 9 號到 15號為重復天數,
只統計一次,即 vivo 總打折天數為 2021-06-05 到 2021-06-21 共計 17 天。

建表:

數據準備:

create table t18(brand             string,stt           string,edt           string
)row format delimited fields terminated by '\t';
load data local inpath '/opt/data/t18.txt' overwrite into table  t18;

需求實現:

select brand,sum(c2)
from(select brand,datediff(edt,if(stt>=c1,stt,date_add(c1,1))) c2from(select brand,stt,edt,nvl(max(edt) over (partition by brand order by stt rows between unbounded precedingand 1 preceding),stt) c1from t18) t1)t2 where c2 > 0 group by brand;

?hsql語句分析:

  1. 最內層查詢(子查詢t1):

    • t18表中選擇brandsttedt
    • 使用窗口函數MAX(edt) OVER (...)計算每個品牌下,按stt排序的每個行之前的最大edt值。這個窗口的范圍是從所有之前的行(unbounded preceding)到當前行之前的那一行(1 preceding)。
    • 如果當前行的stt大于或等于這個計算出的最大edt(即c1),那么使用stt作為c1的值,否則使用c1的次日(date_add(c1, 1))。這是為了確保c1總是小于或等于當前行的stt,從而避免負的持續時間。
    • 使用nvl函數(這通常是Oracle數據庫中的函數,用于處理NULL值,但在其他數據庫中可能是COALESCE或類似的函數)來處理可能的NULL值。如果窗口函數沒有返回任何行(即對于每個品牌的第一行),則c1將默認為stt
  2. 中間層查詢(子查詢t2):

    • 基于最內層查詢的結果,計算每個事件或時間段的持續時間c2。這是通過計算edtc1之間的日期差來實現的(datediff(edt, c1))。
    • 需要注意的是,由于在最內層查詢中已經確保了c1總是小于或等于stt,所以這里計算出的c2應該總是非負的或零。
  3. 最外層查詢:

    • 從中間層查詢中選擇brand和持續時間c2的總和。
    • 使用WHERE子句過濾掉持續時間為0的情況(雖然根據前面的邏輯,這種情況應該已經不存在了,但這里可能是為了額外的明確性)。
    • 使用GROUP BY子句按brand分組,以便為每個品牌計算總的持續時間。

結果輸出:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14991.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14991.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14991.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java中流的概念細分

按流的方向分類: 輸入流:數據流向是數據源到程序(以InputStream、Reader結尾的流)。 輸出流:數據流向是程序到目的地(以OutputStream、Writer結尾的流)。 按處理的數據單元分類: 字…

PVE 虛擬機環境下刪除 local-lvm分區

1、刪除邏輯卷 lvremote pve/data 2、擴展邏輯卷 lvextend -l 100%FREE -r pve/root 3、 修改存儲目錄內容 點擊 Datacenter - Storage (1)刪除local-lvm分區 (2)編輯local分區,在內容一項中勾選所有可選項。

mysql 兩個不同字段的表導入數據

下面這個場景就是A表的字段和B表的字段不一樣,但是現在我想把b表中的數據導入到A表里面,下面是導入公式如下: 語法: 將SYS_ORG表中的數據導入到sys_depart,但是這兩個表的字段不一樣,在()里面填寫要新增數據…

Spring Boot 3.3 正式發布,王炸級更新,應用啟動速度直接起飛!

最新消息,Spring Boot 一次性發布了 3 個版本: 3.3.0 3.2.6 3.1.13 Spring Boot 3.3 正式發布了,3.1.x 在前幾天也停止維護了。 最新的支持版本如下: 從路線圖可以看到每個版本的終止時間,每個版本的生命周期只有…

安徽大學數學科學學院教授陳昌昊

男,本(2005-2009)、碩(2009-2012)學位都在湖北大學獲得,博士學位在芬蘭獲得(2012-2016),博士后分別在澳大利亞(2016-2019)、香港(2020…

vue3中el-form表單校驗,再點擊提交按鈕的時候通過校驗才進行提交

vue3中el-form表單校驗&#xff0c;再點擊提交按鈕的時候通過校驗才進行提交 一、前言1、案例 一、前言 在 Vue 3 中&#xff0c;可以使用 Element UI 的 <el-form> 組件配合 <el-form-item> 來實現表單的必填項校驗&#xff0c;并在提交時根據校驗結果來決定是否…

clickhouse 中的數組(array)和元組(Tuple)—— clickhouse 基礎篇(二)

文章目錄 數組判斷是否為空計算數組長度獲取數組元素判斷某個元素是否存在數組切片數組元素展開數組元素去重刪除連續重復元素連接多個數組數組倒序數組拍平數組元素映射數組元素過濾數組聚合分析計算數組交集計算數組并集計算數組差集SQL 子查詢進行集合操作 元組創建元組獲取…

LeetCode刷題之HOT100之二叉樹的直徑

2024/5/25 陰天。這幾天睡眠質量都非常好&#xff0c;一切似乎都在慢慢上升。先把題做了 1、題目描述 2、邏輯分析 題目要求就是給一個二叉樹&#xff0c;求出兩個節點之間的最大長度即為二叉樹的直徑。怎么做呢&#xff1f;我想不出來。看一下題解吧。題解給出的解法是深度優…

Swagger2 和 Swagger3 的不同

Swagger2 和 Swagger3 的不同 SpringBoot 整合 Swagger3 和 Swagger2 的主要區別如下&#xff1a; 區別一&#xff1a;引入不同的依賴 如果使用的是 Swagger 3 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter<…

Linux——Docker容器虛擬化平臺

安裝docker 安裝 Docker | Docker 從入門到實踐https://vuepress.mirror.docker-practice.com/install/ 不需要設置防火墻 docker命令說明 docker images #查看所有本地主機的鏡像 docker search 鏡像名 #搜索鏡像 docker pull 鏡像名 [標簽] #下載鏡像&…

學習java第八十天

ApplicationContext有哪些常見實現&#xff1f; FileSystemXmlApplicationContext容器從XML文件加載bean的定義。XML bean配置文件的完整路徑必須提供給構造函數。 ClassPathXmlApplicationContext容器也從XML文件加載bean的定義。這里&#xff0c;你需要正確設置classpath因…

mybatis-plus 優雅的寫service接口中方法(3)

多表聯查 上文講過了自定義sql &#xff0c;和wrapper的使用&#xff0c;但是我們可以發現 我們查詢的都是數據庫中的一張表&#xff0c;那么怎么進行多表聯查呢&#xff0c;當然也是用自定義sql來進行實現 比如說 查詢 id 為 1 2 4 的用戶 并且 地址在北京 的 用戶名稱 普…

Elasticsearch不刪原有jdk8導致的系列安裝和啟動問題

以前在空機器直接裝elasticsearch&#xff0c;沒有遇到什么問題。今天在現有JDK上安裝&#xff0c;遇到的問題記錄一下&#xff1a; 1. JDK的環境變量配置與我原有的不一致報如下錯誤&#xff1a; [estestZK-DES-I root]$ /usr/elasticsearch/bin/elasticsearch could not fi…

python-數據分析與可視化基礎

1、data1.csv中的B、C、D和E列數據分別是日期、權重、A企業的銷售額、B企業的銷售額。讀取C、D、E列數據,并統計E列數據的算術平均數、加權平均值(權值為C列數據)、方差、中位數、最小值、最大值。并繪制E列數據的直方圖。 &#xff08;1&#xff09;源代碼&#xff1a; impo…

JavaScript異步編程:理解和使用Promise、Async/Await

JavaScript是一種單線程語言&#xff0c;這意味著它一次只能執行一個任務。然而&#xff0c;在Web開發中&#xff0c;我們經常需要處理異步操作&#xff0c;例如網絡請求、定時器、事件監聽等。JavaScript提供了多種方式來處理異步編程&#xff0c;包括回調函數、Promise、Asyn…

什么生信流程語言讓你極度爽?

生信流程搭建有多難&#xff1f;行業為解決這一問題提出了各種各樣的配方&#xff0c;有你熟悉的嗎&#xff1f; 一、困境 - 亂 無數機構投入大量人力物力&#xff0c;以期獲得一條條可用的生信流程。而有些流程&#xff0c;由于種種原因&#xff0c;存在著巨大的缺陷&#xf…

安全風險 - 切換后臺時背景模糊處理

因為安全風險中提到當app處于后臺卡片狀態時&#xff0c;顯示的卡片頁面應該為模糊效果&#xff0c;否則容易泄露用戶隱私&#xff0c;尤其當前頁涉及個人信息、資產信息等&#xff0c;都會造成信息泄露&#xff01;基于這種場景&#xff0c;我研究了下這種業務下的模糊效果 找…

普通函數的參數中的auto

2.1 普通函數的參數中的auto 從c14起&#xff0c;lambda可以使用auto占位符聲明或者定義參數: auto printColl [] (const auto& coll) // generic lambda{ for (const auto& elem : coll) {std::cout << elem << \n;}} 只要支持Lambda 內部的操作&…

【OS】AUTOSAR Os是如何啟動第一個Task的

目錄 前言 正文 1.總體概覽及背景介紹 1.1. Os默認的Hook配置 1.2 用戶Task的配置

Golang創建文件夾

方法 package zdpgo_fileimport ("os" )// AddDir 創建文件夾 func AddDir(dir string) error {if !IsExist(dir) {return os.MkdirAll(dir, os.ModePerm)}return nil }測試 package zdpgo_fileimport "testing"func TestAddDir(t *testing.T) {data : […