Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取值大于平均借款利率的日期_Sql_Postgresql - Fatal编程技术网

Sql 获取值大于平均借款利率的日期

Sql 获取值大于平均借款利率的日期,sql,postgresql,Sql,Postgresql,我有一个名为BOOK的表(memberId、ISBN、dateBorrowed) 例如: isbn | memberId | borrowed -------+---------------+-------------+---- 9998-01-101-9 | | 9998-01-101-9 | | 9998-01-101-9 | |

我有一个名为
BOOK
的表(memberId、ISBN、dateBorrowed) 例如:

isbn | memberId | borrowed -------+---------------+-------------+---- 9998-01-101-9 | | 9998-01-101-9 | | 9998-01-101-9 | | 9998-01-101-9 | 1000 | 2018-10-02 9998-01-101-9 | 1010 | 2018-09-04 9998-01-101-9 | 1021 | 2018-09-14 9998-01-101-9 | | 9998-01-101-9 | 1001 | 2018-10-02 我写的另一个查询是计算平均值:

SELECT SUM(dates)/COUNT(borrowed) AS average 
  FROM (
    SELECT borrowed, COUNT(*) AS dates 
      FROM BOOKS
      WHERE borrowed IS NOT NULL GROUP BY borrowed
  ) AS average;

现在,如何将这两个续集连接成一个清晰的续集?

这看起来有点像硬件,所以窗口函数可能是不受限制的

SELECT * 
  FROM (
    SELECT BOOK.*,
           CAST(
           COUNT(1) OVER 
             ( PARTITION BY borrowed
             ) AS FLOAT) cntThatDay,
           CAST(
           SUM(1) OVER() AS FLOAT)/ CAST(
               (SELECT COUNT(DISTINCT borrowed)
                  FROM BOOKS 
               ) AS FLOAT) AS totalAverage
      FROM BOOK 
     WHERE borrowed IS NOT NULL
    ) TMP
WHERE cntThatDay >= totalAverage;

使用窗口功能可以帮助您:

我的测试数据:

isbn             borrowed
9998-01-101-1    2018-08-01
9998-01-101-2    2018-08-01
9998-01-101-3    2018-08-01
9998-01-101-4    2018-08-01
9998-01-101-5    2018-08-01
9998-01-101-1    2018-08-02
9998-01-101-2    2018-08-02
9998-01-101-3    2018-08-02
9998-01-101-4    2018-08-03
9998-01-101-5    2018-08-03
9998-01-101-1    2018-08-04
9998-01-101-2    2018-08-04
9998-01-101-3    2018-08-04
9998-01-101-4    2018-08-04
9998-01-101-5    2018-08-05
9998-01-101-1    2018-08-05
   SELECT 
        * 
    FROM (
        SELECT 
            *, 
            borrowed_all_time::decimal / COUNT(*) OVER () as avg_borrows_per_day    -- D
        FROM (
            SELECT DISTINCT                                                         -- C
                borrowed,
                COUNT(*) OVER (PARTITION BY borrowed) as borrowed_on_day,           -- A
                COUNT(*) OVER () as borrowed_all_time                               -- B
            FROM book
        )s 
    )s
    WHERE borrowed_on_day > avg_borrows_per_day                                     -- E
borrowed
2018-08-01
2018-08-04
查询:

isbn             borrowed
9998-01-101-1    2018-08-01
9998-01-101-2    2018-08-01
9998-01-101-3    2018-08-01
9998-01-101-4    2018-08-01
9998-01-101-5    2018-08-01
9998-01-101-1    2018-08-02
9998-01-101-2    2018-08-02
9998-01-101-3    2018-08-02
9998-01-101-4    2018-08-03
9998-01-101-5    2018-08-03
9998-01-101-1    2018-08-04
9998-01-101-2    2018-08-04
9998-01-101-3    2018-08-04
9998-01-101-4    2018-08-04
9998-01-101-5    2018-08-05
9998-01-101-1    2018-08-05
   SELECT 
        * 
    FROM (
        SELECT 
            *, 
            borrowed_all_time::decimal / COUNT(*) OVER () as avg_borrows_per_day    -- D
        FROM (
            SELECT DISTINCT                                                         -- C
                borrowed,
                COUNT(*) OVER (PARTITION BY borrowed) as borrowed_on_day,           -- A
                COUNT(*) OVER () as borrowed_all_time                               -- B
            FROM book
        )s 
    )s
    WHERE borrowed_on_day > avg_borrows_per_day                                     -- E
borrowed
2018-08-01
2018-08-04
答:此窗口函数统计每个
借用的
日期的行数

B:这个窗口函数统计所有行,等于统计所有时间的借用

目前的结果如下:

borrowed      borrowed_on_day   borrowed_all_time
2018-08-01    5                 16
2018-08-01    5                 16
2018-08-01    5                 16
2018-08-01    5                 16
2018-08-01    5                 16
2018-08-02    3                 16
2018-08-02    3                 16
2018-08-02    3                 16
2018-08-03    2                 16
2018-08-03    2                 16
2018-08-04    4                 16
2018-08-04    4                 16
2018-08-04    4                 16
2018-08-04    4                 16
2018-08-05    2                 16
2018-08-05    2                 16
C:因为我们不需要复制品,所以我们用
不同的

D:在消除所有绑定行之后计算所有行将给出不同天数的计数。这除以所有时间的借款得出平均每天的借款。
decimal
cast是必需的。它将整数除法(
16/5==3
)转换为浮点除法(
16/5==3.2

E:现在我们可以过滤每天的借款>每天平均借款

结果:

isbn             borrowed
9998-01-101-1    2018-08-01
9998-01-101-2    2018-08-01
9998-01-101-3    2018-08-01
9998-01-101-4    2018-08-01
9998-01-101-5    2018-08-01
9998-01-101-1    2018-08-02
9998-01-101-2    2018-08-02
9998-01-101-3    2018-08-02
9998-01-101-4    2018-08-03
9998-01-101-5    2018-08-03
9998-01-101-1    2018-08-04
9998-01-101-2    2018-08-04
9998-01-101-3    2018-08-04
9998-01-101-4    2018-08-04
9998-01-101-5    2018-08-05
9998-01-101-1    2018-08-05
   SELECT 
        * 
    FROM (
        SELECT 
            *, 
            borrowed_all_time::decimal / COUNT(*) OVER () as avg_borrows_per_day    -- D
        FROM (
            SELECT DISTINCT                                                         -- C
                borrowed,
                COUNT(*) OVER (PARTITION BY borrowed) as borrowed_on_day,           -- A
                COUNT(*) OVER () as borrowed_all_time                               -- B
            FROM book
        )s 
    )s
    WHERE borrowed_on_day > avg_borrows_per_day                                     -- E
borrowed
2018-08-01
2018-08-04

欢迎来到SO。我们是来帮助你的,不是为你工作。通过编写一个sql查询:)到目前为止,您做了哪些尝试?出了什么问题?我已经选择了日期以及它被选择了多少次:选择借来的,计数(*)作为借来的不为空的书中的日期按借来分组;更新了我所做的描述。