如何使用(重复)聚合函数值与表中的其他列我使用聚合函数

时间:2015-12-14 19:59:55

标签: postgresql

问题:我必须计算某个用户拥有证书的次数,然后返回用户名,证书数以及所有用户的最大证书数与此特定用户证书数之间的差异。我成功完成了第一部分(获得证书的数量),我将其称为$ 查询 $(因为我感觉我的问题与别名有关)。

所以$ 查询 $看起来像这样:

User        |N_Certificates
Geoff         4
Ann           2
Lisa          0

我的最终结果应如下所示:

User        |N_Certificates |Difference
Geoff         4              0
Ann           2              2
Lisa          0              4

我尝试了这个查询:

     SELECT Sub.name, Sub.N_Certificates,
     MAX(Sub.N_Certificates)-  Sub.Certificates AS Difference FROM ($_query_$) AS SUB

但它返回了一个错误(因为我试图将聚合函数与我没有分组的列结合使用)或错误的结果(特别是所有列的差异= 0)。

我在另一个版本的sub(同样的$ 查询 $ code和另一个别名)上尝试了INNER JOIN的装置,但它也没有用(同样的原因)。我可以硬编码最大但我不认为这是一个很好的解决方案。我的屏幕告诉我,我使用的是pg_Admin版本1.18。

1 个答案:

答案 0 :(得分:0)

你不能这样做,SQL语法不允许这样做。

最简单的方法是使用子查询:

    /*Styles The Sections Home, About, Portfolio, Contact */
    .main-section{
        padding: 10%;
        min-height:  850px;
        text-align : center;
        vertical-align : middle;
    }


/*Styles for the home section */
 /*For the contact buttons used*/
    .social-links{
        margin : 5px;
    }

    /*Jumbotron */
    .jumbotron{
        background-color: rgba(0, 0, 0, 0.2);
    }    

    .home h1 {
            font-size : 4.5em;
            font-family: "Bitter";
            color : whitesmoke;
        }

    .home h2 {
        font-size : 2.5em;
        font-family: "Nunito";
        color : whitesmoke;
    }

    .home{
       background: #464646 url(https://lh3.googleusercontent.com/oP9QfLUk4_YixVCz4fuKCpxkJ2LtR3g0YGoKtLYSA_vBQTO1YFHZfg2Iscj5hYF1vuSaHbF_QMSnoM6f_-XXYI9P47W5dKDafjeLJKEAa-dls_WjgKOZZEfdxCcZt1g_4uuGyxWdm5R6xQDV9ZQ1w6aDdWnhDLoofjJkNWUMNy3rV-hXIIKrY9T-81pN6kuhVY7uFxZYhOwo0hhvKr2e7ET5QnNy2PUO5T_FQ7TZKQWewkF7ljey6i_B1fnwoI8IBXtN0csoBPrV7kryK-PRUBbou3boG4ikPMU9NPLq1ljze5er0cKVvCWbtVhgbcNjg-B6emsSRvqHhqsZ7-WyQmMb4B4BOTohU9DJwfiVTv38boBYAgIKGCC_55pAZA9tb1nQ4oZbadxq02AfU_WkIqH21jltrOyf7sN2mK5VgTAT1fDP2r6D3yap0y-floTAvWtcrxeXWOmLiwZ7vNpIebLAkuq04yQcXPuscnU-J7VzaRBnCadoTt8BEgY3n2sNjeGwxIPLMnTKtZFDEUZBC77pRQ7ZwtgjPFcbxycwbVwD6IiBZxprdoV7F3Q65wpvR8EHyQ=w1343-h895-no) center center / cover no-repeat fixed; 
    }

/*End Styles for the home section*/

/*Styles for the about section*/

/*About Section Styles*/

    .about h1 {
        font-family: "Bitter";
        color : whitesmoke;
    }

    .about h2 {
        font-size : 4.5em;
        font-family: "Nunito";
        color : black;
    }

    .about p {
        font-size : 2.5em;

    }

    /*Background Image For Aboutscreen*/
    .about{
  background: #464646 url(https://lh3.googleusercontent.com/O1lxoFC8mNtnvpUIDL5VoX_smh8PV-1ZBER1KA9jcpGVkXYi72DJwHfW1Ehj2bMU9wl2LoKpSUee7EmyXxK57vPgWESE3XILTBGfEBj5wE1AXxFL4jYdBTAXbQg-X-Cdyzi3P5nrI5KRtQ57I6gbvst8sTRF-W79W1YPEQGkIRIcA_LPhz0-V1K6oqTd3o_jchKF5wxgTEDin9h5089wY94egqJbop0yeENb6mPrc44K3d5k-Z2ZXyq5MpJ-CDQG3gv0I6SKnJrlQe1cZXe3bB2KoRUaYfOors1937aaNRDe3UFPaCZgRkGm61NDoMyP0R0_b0zykjMfG--WnO6yo3JZqHBj9C-8HYi3dX4GBPS95gH61gmf58HA0ZJb-0ksjA6pzN4-rfIHyMCqH6reG6m5qyf6lKhrpCNUQCMWHLROxsmb30ImW4uS01uDZLUjljCY9q4arv17FaPaRqUTiov4DBxNk4PUxqBQDXxMWM8OjnPuVc-upRQmtbNCgkhB1wpYFSdFsEQ5ksKdnwZfamxYs2K7AQCkyg9BBKQqJcRCTWRfKTyhmeT0chWeAqw4HEmNfg=w1343-h895-no) center center / cover no-repeat fixed;     
    }

    /*Div holding about-image*/
    .img-container{
        overflow: auto;
        padding : 10% 0% 0% 0%;
    }

    /*Making abuot-image circular*/
    .about-image{
        padding: 0% 0% 0% 0%;
        float: left;
        border-radius : 50%;
        width : 50%
    }

    .h2{
        color: black;
    }

/*End About Section Styles

您还可以使用公用表表达式:

SELECT Sub.name, Sub.N_Certificates,
     (SELECT MAX(Sub.N_Certificates) FROM ($_query_$))
      -  
     Sub.Certificates AS Difference 
FROM ($_query_$) AS SUB

您可以使用Windows功能:http://www.postgresql.org/docs/9.1/static/tutorial-window.html

WITH some_alias AS(
   SELECT * FROM ($_query_$)
)
SELECT name, N_Certificates.
       (SELECT MAX(N_Certificates)FROM some_alias)
          -  
       Certificates AS Difference    
FROM some_alias