日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQLite | Group By 和 Order By 子句

發布時間:2025/3/15 数据库 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQLite | Group By 和 Order By 子句 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1. Group by and Order by
    • 1.1 Group Records
    • 1.2 Ordering Records
    • 1.3 Aggregate Functions
    • 1.4 The Having Statement
    • 1.5 Getting Distinct Records
    • 參考資料

1. Group by and Order by

我們在上一篇中介紹了 Where 子句,接下來我們將使用 Group by 和 Order by 子句,對數據進行聚合和排序。

  • 使用Jupyter Notebook 運行 SQL 語句需安裝 ipython-sql

  • %sql 以及 %%sql 為在 Notebook 中運行 SQL 語句,在 SQLite 命令行或 SQLite Stiduo 中不需要 %sql 或 %%sql

載入 SQL 以及連接 SQLite:

%load_ext sql %sql sqlite:///DataBase/weather_stations.db 'Connected: @DataBase/weather_stations.db'

本文將使用 weather_stations.db 數據庫,其中包含了 STATION_DATA 表。

首先查看 STATION_DATA 表中的數據:

%sql select * from station_data limit 0,5; -- 篩選前五行 * sqlite:///DataBase/weather_stations.db Done. station_numberreport_codeyearmonthdaydew_pointstation_pressurevisibilitywind_speedtemperatureprecipitationsnow_depthfograinhailthundertornado
14308034DDA72002122133.8987.43.40.2360None11111
76644039537B199810172.71014.65.96.783.30None00000
176010C3C6D5200151855.7None7.34.369.10None00000
1256001451502007101433None6.92.539.70None00000
470160EF616A196772965.6None9.21.272.40.04None00000

1.1 Group Records

首先從最簡單的聚合方法開始:計數:

%%sql select count(*) as record_cound from station_data; * sqlite:///DataBase/weather_stations.db Done. record_cound
28000

count(*) 意味著計算記錄的長度,你也可以和其他 SQL 操作符結合起來使用,比如 where,我們可以這樣計算 tornado 出現的次數:

%%sql select count(*) as record_count from station_data where tornado == 1; * sqlite:///DataBase/weather_stations.db Done. record_count
3000

我們找到了 3000 條包含 tornado 的記錄,但如果我們想要按年計數呢?我們可以這樣寫:

%%sql select year, count(*) as record_count from station_data where tornado == 1 group by year limit 0,3; -- 只展示前三條 * sqlite:///DataBase/weather_stations.db Done. yearrecord_count
19373
19413
19423

我們現在可以看到每年的計數,讓我們拆分下這個查詢來看看怎么執行的:

select year, -- 1. 首先,我們選擇了 year(select year) count(*) as record_count -- 2. 然后我們用 **count(\*)** 對篩選的記錄進行了計數 from station_data where tornado == 1 -- 3. 我們篩選了 tornado 為 true 的數據 group by year -- 4. 最后,按年進行分類

我們也可以在多個 field 上進行聚合:

%%sql select year, month, count(*) as record_count from station_data where tornado == 1 group by year, month limit 0,3; * sqlite:///DataBase/weather_stations.db Done. yearmonthrecord_count
193773
194183
1942103

此外,在使用 group by 時,我們可以也用 序數位置(ordinal positions):

%%sql select year, month, count(*) as record_count from station_data where tornado == 1 group by 1, 2 -- ordinal positions limit 0,5; * sqlite:///DataBase/weather_stations.db Done. yearmonthrecord_count
193773
194183
1942103
194313
194343

不是所有的平臺都支持 ordinal positions,例如 Oracle 和 SQL Server,就只能寫全稱

1.2 Ordering Records

需要注意到,我們通過 group 得到的數據中 month 并不是按自然月份排序的,所以字哦好就是同時使用 oreder by 操作符來進行排序,如果你想要先按年份排序,再按月份排序,你只需要添加:

%%sql select year, month, count(*) as record_count from station_data where tornado == 1 group by 1, 2 -- ordinal positions order by 1, 2 -- order by 同樣支持 ordinal positions limit 0,5; * sqlite:///DataBase/weather_stations.db Done. yearmonthrecord_count
193773
194183
1942103
194313
194343

order by 默認是按升序(ASC)排列的,然而你可能更對近期的數據感興趣,你可以通過添加 DESC 來指定排序方式:

%%sql select year, month, count(*) as record_count from station_data where tornado == 1 group by year, month order by year DESC, month limit 0,5; * sqlite:///DataBase/weather_stations.db Done. yearmonthrecord_count
201036
200913
200923
200942
200956

1.3 Aggregate Functions

我們已經使用 count(*) 來對記錄進行計數了,但還有其他的一些聚合函數(AggregateyFunctions),
sum()、min()、max()avg()。我們可以在特定的列上使用聚合函數來進行計算。

圖1 SQLite 內置聚合函數

但首先讓我們來看看 count() 的另一種使用方式, count() 可以用于除了計數以外的其他用途。如果你不使用 * ,
而是指定某一列,那么它將會計算所有非缺失值(non-null)的個數。舉個例子,我們可以計算 snow_depth 中非缺失值的個數:

%%sql select count(snow_depth) as recorded_snow_depth_count from station_data * sqlite:///DataBase/weather_stations.db Done. recorded_snow_depth_count
1552

讓我們進一步看看聚合函數,如果你想要看看你從 2000 年開始每個月的平均溫度,你可以先篩選 2000 年的記錄,
然后按月份分組,最后計算平均溫度:

%%sql select month, avg(temperature) as avg_temp from station_data where year >= 2000 group by month limit 0,3; * sqlite:///DataBase/weather_stations.db Done. monthavg_temp
141.55585443037976
238.98063127690104
348.975062656641576

sum() 是另一個常見的聚合操作符,為了得到 2000 年至今每年的下雪深度,你可以這樣查詢:

%%sql select year, sum(snow_depth) as total_snow from station_data where year >= 2000 group by year limit 0,3; * sqlite:///DataBase/weather_stations.db Done. yeartotal_snow
2000685.8999999999999
2001391.90000000000003
2002437.69999999999993

你可以在一次查詢中多次使用聚合操作,我們將 2000 年以來的下雪總量、下雨總量和最大降雨量分別統計出來,并保留兩位小數:

%%sql select year, round(sum(snow_depth), 2) as total_snow, round(sum(precipitation), 2) as total_precipitation, round(max(precipitation), 2) as max_precipitation from station_data where year >= 2000 group by year limit 0,3; * sqlite:///DataBase/weather_stations.db Done. yeartotal_snowtotal_precipitationmax_precipitation
2000685.927.570.87
2001391.938.152.95
2002437.743.065.0

1.4 The Having Statement

假設你想要基于一個聚合值來篩選記錄,你的第一反應應該是使用 where 子句。確實, where 子句可以
用來篩選記錄,但是卻無法用于聚合值上。舉個例子,如果你想使用 where 子句篩選出總下雨量大于 30 的記錄,
就會出現以下錯誤:

%%sql select year, sum(precipitation) as total_precipitation from station_data where total_precipitation > 30 group by year limit 0,3; * sqlite:///DataBase/weather_stations.db (sqlite3.OperationalError) misuse of aggregate: sum() [SQL: select year, sum(precipitation) as total_precipitation from station_data where total_precipitation > 30 group by year limit 0,3;] (Background on this error at: http://sqlalche.me/e/e3q8)

為什么不起作用呢?首先我們來看下聚合的原理,首先程序一行一行的掃描,找出那些在 where 子句
上成立的數據,然后再進行聚合。然而在聚合前并沒有 total_precipitation 這一列數據,因此出錯。

當你想在聚合值上執行 where 這個方法時,只能使用 having 這個關鍵詞:

%%sql select year, sum(precipitation) as total_precipitation from station_data group by year having total_precipitation > 30 limit 0,3 * sqlite:///DataBase/weather_stations.db Done. yeartotal_precipitation
197335.07999999999996
197442.209999999999994
197548.25999999999997

having 相當于聚合版的 where,但并不是所有平臺都支持在 aliases 上使用 having
如 Oracle(group by 也不行),這意味著當你使用 having 時需要再輸入一次聚合函數,像這樣:

%%sql select year, sum(precipitation) as total_preicipitation from station_data group by year having sum(precipitation) > 30 limit 0,3 * sqlite:///DataBase/weather_stations.db Done. yeartotal_preicipitation
197335.07999999999996
197442.209999999999994
197548.25999999999997

1.5 Getting Distinct Records

當我們使用 **select from** 時,記錄中可能會包含重復值,如果你只想要返回**唯一值(distinct records)**, 你可以使用 **select distinct from**,比如我們的 station_data,表中 station_number 一列包含 了 28000 個值,但你通過 **select distinct from** 后會發現其中是 6368 個值不斷重復出現組成的 %%sql select count(station_number) as duplicate_num from station_data; * sqlite:///DataBase/weather_stations.db Done. duplicate_num
28000
%%sql select count(distinct station_number) as distinct_num from station_data; * sqlite:///DataBase/weather_stations.db Done. distinct_num
6368

參考資料

[1] Thomas Nield.Getting Started with SQL[M].US: O’Reilly, 2016: 29-37

相關文章:

SQL | 目錄
SQLite | SQLite 與 Pandas 比較篇之一
SQLite | Select 語句
SQLite | Where 子句
SQLite | CASE 子句
SQLite | Join 語句
SQLite | 數據庫設計與 Creat Table 語句
SQLite | Insert、Delete、Updata 與 Drop 語句

總結

以上是生活随笔為你收集整理的SQLite | Group By 和 Order By 子句的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www.av777| 日韩欧美麻豆 | 国产精品国语自产拍在线观看 | 日韩伦理一区 | 亚洲国产精品va在线 | 国产中文字幕第一页 | 成人xxxx| 高潮一区二区三区乱码 | 青青久在线视频 | 日韩精品理论 | 九一网站在线观看 | 青春草免费视频 | 蜜臀av性久久久久蜜臀aⅴ | 大陆一级黄色片 | 国产a∨精品一区二区三区仙踪林 | 天天干干 | 影音先锋在线视频观看 | 国产在线视频你懂的 | 成人在线免费高清视频 | 亚洲欧美www | 亚洲无毛视频 | 中国肥胖女人真人毛片 | 奇米777色| 制服丝袜在线视频 | 秋霞福利视频 | 成年人免费看视频 | 国产影视一区二区 | 亚洲福利精品 | 亚洲九九在线 | 美女综合网 | 欧美日b视频 | 少妇无套高潮一二三区 | 中文字幕乱码人妻一区二区三区 | 美女扒开粉嫩的尿囗给男生桶 | wwwww在线观看 | jzzjzzjzz亚洲成熟少妇 | 日韩精品无码一区二区 | 亚洲调教 | 青青视频免费在线观看 | 日本系列第一页 | 亚洲人成小说 | 亚洲精选免费 | 成人区人妻精品一区二区不卡视频 | 99久久婷婷国产综合精品草原 | 97成人人妻一区二区三区 | 少妇久久久久久久久久 | 麻豆视频黄色 | 亚洲精品 日韩无码 | 免费国产在线视频 | 狠狠cao日日穞夜夜穞av | 久久久久无码国产精品一区李宗瑞 | 福利视频免费观看 | www国产亚洲精品 | 国产精品宾馆在线精品酒店 | 综合久久久久久 | 在线精品视频播放 | 调教一区 | 欧美少妇一级片 | 国产吃瓜黑料一区二区 | 欧美日韩一卡二卡 | 午夜动态图| 国产精品天天av精麻传媒 | 国产精品视频全国免费观看 | 国内久久久久 | 亚洲第一激情 | 国产淫视 | 久久女同互慰一区二区三区 | 日b免费视频 | 青草视频污 | 欧美一区二区三区在线播放 | 最新av | 欧美一区二区在线播放 | 禁果av一区二区三区 | 亚洲妇女无套内射精 | 都市豪门艳霸淫美妇 | 老妇裸体性激交老太视频 | 无套白嫩进入乌克兰美女 | 中文字幕无码精品亚洲资源网久久 | 开心综合网 | 国产精品久久网 | 成人深夜福利视频 | 日韩欧美精品中文字幕 | 日韩大片免费看 | www.欧美.com | 九九欧美 | 国产精品23p | 日韩伦理中文字幕 | 91久热| 99热伊人 | 少妇极品熟妇人妻无码 | 国产一区二区三区视频播放 | 波多野结衣乳巨码无在线观看 | 日本公与丰满熄 | 韩国三级hd中文字幕的背景音乐 | 激情久久综合 | 青娱乐99 | 国产精品久久久久久久久久久久久久久久 | 国产午夜小视频 | 青青草原综合网 |