最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PostgreSQL實(shí)現(xiàn)透視表查詢的方法詳解

 更新時(shí)間:2024年12月01日 15:19:00   作者:夢(mèng)想畫家  
PostgreSQL 8.3版本發(fā)布時(shí),引入了一個(gè)名為tablefunc的新擴(kuò)展,這個(gè)擴(kuò)展提供了一組非常有趣的函數(shù),其中之一是交叉表函數(shù),用于創(chuàng)建數(shù)據(jù)透視表,這就是我們將在本文中討論的內(nèi)容,本文給大家介紹了PostgreSQL實(shí)現(xiàn)透視表查詢的方法,需要的朋友可以參考下

需求說(shuō)明

解釋此函數(shù)如何工作的最簡(jiǎn)單方法是使用帶有數(shù)據(jù)透視表的示例。首先,我們將從實(shí)際角度解釋我們最初的觀點(diǎn),然后定義所需的數(shù)據(jù)透視表。

假設(shè)我們是老師,需要統(tǒng)計(jì)你教所有科目的成績(jī)(語(yǔ)言、音樂(lè)等),學(xué)校為你提供了記錄所有評(píng)估或測(cè)試結(jié)果的系統(tǒng)。下面的SQL語(yǔ)句將顯示之前加載到系統(tǒng)中的計(jì)算結(jié)果:

SELECT *
FROM evaluations

示例數(shù)據(jù)如下:

StudentSubjectEvaluation_resultEvaluation_day
Smith, JohnMusic7.02016-03-01
Smith, JohnMaths4.02016-03-01
Smith, JohnHistory9.02016-03-22
Smith, JohnLanguage7.02016-03-15
Smith, JohnGeography9.02016-03-04
Gabriel, PeterMusic2.02016-03-01
Gabriel, PeterMaths10.02016-03-01
Gabriel, PeterHistory7.02016-03-22
Gabriel, PeterLanguage4.02016-03-15
Gabriel, PeterGeography10.02016-03-04
  • 期望結(jié)果

下面的表格可以很容易地跟蹤學(xué)生的進(jìn)度。在計(jì)算機(jī)科學(xué)中,我們稱這種網(wǎng)格為透視表。如果分析數(shù)據(jù)透視表,你會(huì)發(fā)現(xiàn)我們使用原始數(shù)據(jù)中的值作為列標(biāo)題或字段名(在本例中是地理、歷史、數(shù)學(xué)等)。

希望的數(shù)據(jù)格式如下:

StudentGeographyHistoryLanguageMathsMusic
Gabriel, Peter10.07.04.010.02.0
Smith, John9.09.07.04.07.0

啟用tablefunc擴(kuò)展

正如我們前面提到的,crosstab 函數(shù)是PostgreSQL擴(kuò)展tablefunc的一部分。要調(diào)用crosstab 函數(shù),必須首先通過(guò)執(zhí)行以下SQL命令啟用tablefunction擴(kuò)展:

CREATE extension tablefunc;

crosstab 函數(shù)

crosstab 函數(shù)接收SQL SELECT命令作為參數(shù),該參數(shù)必須符合以下限制:

  • SELECT必須返回3列。
  • SELECT中的第一列將是數(shù)據(jù)透視表或最終結(jié)果中每一行的標(biāo)識(shí)符。在我們的例子中,這是學(xué)生的名字。注意學(xué)生的名字(John Smith和Peter Gabriel)是如何出現(xiàn)在第一列中的。
  • SELECT中的第二列表示透視表中的類別。在我們的例子中,這些類別是學(xué)校的科目。需要注意的是,該列的值將擴(kuò)展到數(shù)據(jù)透視表中的許多列中。如果第二列返回5個(gè)不同的值(地理、歷史等),則數(shù)據(jù)透視表將有5列。
  • SELECT中的第三列表示分配給數(shù)據(jù)透視表的每個(gè)單元格的值。這些是我們示例中的求值結(jié)果。

如果我們把數(shù)據(jù)透視表看作一個(gè)二維數(shù)組,那么第一個(gè)SELECT列是數(shù)組的第一個(gè)維度,第二個(gè)SELECT列是第二個(gè)維度,第三個(gè)是數(shù)組元素的值。比如grid [first_column_value, second_column_value] = third_column_value。

SELECT student, subject, evaluation_result FROM evaluations ORDER BY 1,2

crosstab 函數(shù)在SELECT語(yǔ)句的FROM子句中調(diào)用。我們必須定義將進(jìn)入最終結(jié)果的列和數(shù)據(jù)類型的名稱。就我們的目的而言,最終結(jié)果定義為:

AS final_result(Student TEXT, Geography NUMERIC,History NUMERIC,Language NUMERIC,Maths NUMERIC,Music NUMERIC)

整合上面的內(nèi)容,完整的語(yǔ)句:

SELECT *
FROM crosstab( 'select student, subject, evaluation_result from evaluations order by 1,2')
     AS final_result(Student TEXT, Geography NUMERIC,History NUMERIC,Language NUMERIC,Maths NUMERIC,Music NUMERIC);

查詢結(jié)果如下:

StudentGeographyHistoryLanguageMathsMusic
Gabriel, Peter10.07.04.010.02.0
Smith, John9.09.07.04.07.0

透視表實(shí)戰(zhàn)示例

從單個(gè)數(shù)據(jù)集,我們可以生成許多不同的數(shù)據(jù)透視表。讓我們繼續(xù)以教師和班級(jí)為例,看看我們的一些選項(xiàng)。

查詢學(xué)生每月成績(jī)

作為老師,我們可能還需要一份學(xué)生今年迄今為止的評(píng)估結(jié)果報(bào)告。例如,假設(shè)我們想要獲得約翰·史密斯從3月到7月的平均評(píng)價(jià)。在如下的網(wǎng)格中,表格看起來(lái)是這樣的:

month textgeography numerichistory numericlanguage numericmaths numericmusic numeric
39.009.007.004.007.00
44.007.507.004.005.66
58.006.007.007.007.00
67.507.007.007.008.00
76.669.007.7510.006.00

實(shí)現(xiàn)透視表SQL:

SELECT *
FROM crosstab( 'select extract(month from period)::text, subject.name,
             trunc(avg(evaluation_result),2)
     from evaluation, subject 
     where evaluation.subject_id = subject.subject_id and student_id = 1
     group by 1,2 order by 1,2')  AS final_result(Month TEXT, Geography NUMERIC,History NUMERIC,Language NUMERIC,Maths NUMERIC,Music NUMERIC);

處理不完整記錄

我們也可以稱這一節(jié)為“交叉表的限制以及如何解決它”。在討論這個(gè)問(wèn)題之前,讓我們先來(lái)設(shè)定一下場(chǎng)景:

假設(shè)你想看看是否有些學(xué)生在某些科目上沒(méi)有考試分?jǐn)?shù)。也許你可以嘗試前面的查詢,為July添加一個(gè)WHERE子句。代碼看起來(lái)像這樣:

SELECT *
FROM crosstab( 'select student, subject, evaluation_result from evaluations where extract (month from evaluation_day) = 7 order by 1,2')
     AS final_result(Student TEXT, Geography NUMERIC,History NUMERIC,Language NUMERIC,Maths NUMERIC,Music NUMERIC);

下面的數(shù)據(jù)透視表是該查詢的結(jié)果。我們很快就可以看到,我們沒(méi)有給彼得的語(yǔ)言、數(shù)學(xué)和音樂(lè)評(píng)分。

StudentGeographyHistoryLanguageMathsMusic
Gabriel, Peter10.06.07.00
Smith, John6.08.06.09.04.0

但是,如果我們嘗試常規(guī)查詢以獲得Peter在7月份的成績(jī)……

SELECT * from evaluations
where extract ( month from evaluation_day)=7 and student like 'Gabriel, Peter'

當(dāng)然,第二個(gè)查詢是正確的,因?yàn)樗@示的是原始數(shù)據(jù)。問(wèn)題是數(shù)據(jù)透視表構(gòu)建過(guò)程中,有些種類的信息缺失。為了解決這個(gè)問(wèn)題,我們可以使用帶有第二個(gè)參數(shù)的交叉表函數(shù),該參數(shù)表示完整的類別列表。如果存在缺失值,數(shù)據(jù)透視表仍將正確構(gòu)建。

第二個(gè)參數(shù)內(nèi)容:‘select name from subject order by 1’ ,完整語(yǔ)句如下:

SELECT *
FROM crosstab( 'select student, subject, evaluation_result from evaluations
                where extract (month from evaluation_day) = 7 order by 1,2',
                'select name from subject order by 1')
     AS final_result(Student TEXT, Geography NUMERIC,History NUMERIC,Language NUMERIC,Maths NUMERIC,Music NUMERIC);

現(xiàn)在輸出結(jié)果包括缺失科目,并使用–表示:

StudentGeographyHistoryLanguageMathsMusic
Gabriel, Peter10.06.0
Smith, John6.08.06.09.04.0

練習(xí)數(shù)據(jù)

數(shù)據(jù)透視表為我們提供了一種不同的方式來(lái)查看數(shù)據(jù)。此外,我們可以使用交叉表函數(shù)基于相同的原始數(shù)據(jù)創(chuàng)建不同的數(shù)據(jù)透視表。嘗試構(gòu)建一個(gè)數(shù)據(jù)透視表,根據(jù)下表中的原始數(shù)據(jù)顯示每個(gè)城市和月份的最高溫度。

CREATE TABLE weather (city text, when timestamp, temperature float);
CityWhenTemperature
Miami2016-01-01 08:00:0068.6
Miami2016-01-21 08:00:0073.3
Orlando2016-01-01 08:00:0072.5
Miami2016-02-01 18:00:0058.6
Orlando2016-02-02 18:00:0062.5
Miami2016-03-03 08:00:0055.6
Orlando2016-03-03 08:00:0056.7
Miami2016-04-04 18:00:0050.6
Orlando2016-04-04 18:00:0061.5

數(shù)據(jù)透視表應(yīng)為每個(gè)城市有一行,每個(gè)月有一列。如果你愿意,可以考慮使用相同的數(shù)據(jù)制作其他數(shù)據(jù)透視表。卷起袖子,試試吧。

到此這篇關(guān)于PostgreSQL實(shí)現(xiàn)透視表查詢的方法詳解的文章就介紹到這了,更多相關(guān)PostgreSQL透視表查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PostgreSQL數(shù)據(jù)庫(kù)密碼被遺忘時(shí)的操作步驟

    PostgreSQL數(shù)據(jù)庫(kù)密碼被遺忘時(shí)的操作步驟

    密碼遺忘是常見(jiàn)的用戶問(wèn)題,因此提供一種安全的遺忘密碼找回機(jī)制是十分必要的,這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫(kù)密碼被遺忘時(shí)的操作步驟的相關(guān)資料,需要的朋友可以參考下
    2025-06-06
  • PostgreSQL報(bào)錯(cuò) 解決操作符不存在的問(wèn)題

    PostgreSQL報(bào)錯(cuò) 解決操作符不存在的問(wèn)題

    這篇文章主要介紹了PostgreSQL報(bào)錯(cuò) 解決操作符不存在的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • 基于PostgreSQL的時(shí)序數(shù)據(jù)庫(kù)TimescaleDB的基本用法和概念

    基于PostgreSQL的時(shí)序數(shù)據(jù)庫(kù)TimescaleDB的基本用法和概念

    時(shí)序數(shù)據(jù)是指按照時(shí)間順序存儲(chǔ)的數(shù)據(jù),TimescaleDB是一個(gè)開(kāi)源的、擴(kuò)展了PostgreSQL的時(shí)序數(shù)據(jù)庫(kù)擴(kuò)展,本文就給大家詳細(xì)的介紹一下基于PostgreSQL的時(shí)序數(shù)據(jù)庫(kù)TimescaleDB的基本用法和概念,需要的朋友可以參考下
    2023-06-06
  • postgresql 獲取兩個(gè)時(shí)間類型小時(shí)差值案例

    postgresql 獲取兩個(gè)時(shí)間類型小時(shí)差值案例

    這篇文章主要介紹了postgresql 獲取兩個(gè)時(shí)間類型小時(shí)差值案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • PostgreSQL關(guān)閉數(shù)據(jù)庫(kù)服務(wù)的三種模式

    PostgreSQL關(guān)閉數(shù)據(jù)庫(kù)服務(wù)的三種模式

    PostgreSQL 提供了三種關(guān)閉數(shù)據(jù)庫(kù)服務(wù)的不同方式,它們最終都是發(fā)送一個(gè)關(guān)閉信號(hào)到 postgres 主服務(wù)進(jìn)程,本文將給大家詳細(xì)的介紹一下這三種模式,需要的朋友可以參考下
    2024-07-07
  • PostgreSQL中的COMMENT用法說(shuō)明

    PostgreSQL中的COMMENT用法說(shuō)明

    這篇文章主要介紹了PostgreSQL中的COMMENT用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • postgresql邏輯復(fù)制的實(shí)現(xiàn)

    postgresql邏輯復(fù)制的實(shí)現(xiàn)

    本文介紹PostgreSQL邏輯復(fù)制實(shí)現(xiàn),基于發(fā)布訂閱模型,需設(shè)置WAL_LEVEL為logical,支持跨庫(kù)備份,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • Postgresql 數(shù)據(jù)庫(kù)轉(zhuǎn)義字符操作

    Postgresql 數(shù)據(jù)庫(kù)轉(zhuǎn)義字符操作

    這篇文章主要介紹了Postgresql 數(shù)據(jù)庫(kù)轉(zhuǎn)義字符操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • PostgreSQL EXPLAIN 的深入解析與應(yīng)用實(shí)例小結(jié)

    PostgreSQL EXPLAIN 的深入解析與應(yīng)用實(shí)例小結(jié)

    文章介紹了PostgreSQL的查詢優(yōu)化器如何為SQL查詢生成和選擇合適的查詢計(jì)劃,以及如何使用EXPLAIN命令查看和理解這些計(jì)劃,最后總結(jié)了使用EXPLAIN時(shí)的注意事項(xiàng)和常見(jiàn)誤區(qū),幫助讀者更好地理解和優(yōu)化PostgreSQL查詢性能,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • PostgreSQL 中唯一約束和唯一索引的區(qū)別小結(jié)

    PostgreSQL 中唯一約束和唯一索引的區(qū)別小結(jié)

    本文主要介紹了PostgreSQL 中唯一約束和唯一索引的區(qū)別小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-02-02

最新評(píng)論

昌图县| 恩平市| 措勤县| 漳平市| 大渡口区| 正阳县| 临汾市| 英山县| 平利县| 阿克| 平远县| 班玛县| 大石桥市| 金溪县| 杂多县| 弥渡县| 平顶山市| 汤阴县| 高青县| 射阳县| 永和县| 新河县| 安溪县| 铜陵市| 舒兰市| 和林格尔县| 连州市| 德兴市| 丰镇市| 长治县| 富宁县| 三明市| 奎屯市| 西城区| 临澧县| 磴口县| 大新县| 晋城| 安龙县| 黑山县| 贵定县|