如何在sql中计算两个日期之间的行数?

2ic8powd  于 2021-07-29  发布在  Java
关注(0)|答案(4)|浏览(509)

我有一个带有索引列(有时更改为b)、price和pricedate的表。我想添加列计数,它显示特定月份的工作日数

我尝试了以下代码,但是它显示列价格也应该分组。我试着选择没有价格栏,但在counta栏我得到了每个日期只有1。你知道如何解决这个问题并得到上表所示的结果吗?

select priceindex, price, pricedate ,count(pricedate) as counta --, price
from myDB
and pricedate between date_trunc('month',pricedate) and pricedate + interval '1 day'
group by index, pricedate
iq3niunx

iq3niunx1#

如果pricedate数据没有重复项,则不需要groupby。如果pricedate有重复的值,那么您确实需要一个group by,但问题是:当您按pricedate分组时,您希望价格发生什么变化,因为同一日期可能有两个不同的价格?例如

price  pricedate
6      06.05.2020
4      06.05.2020

在这种情况下,你想要什么价格,4还是6?一个好的答案可能是平均值:

select index, avg(price), pricedate, count(pricedate) as counta
from myDB
where pricedate between date_trunc('month',pricedate) and pricedate + interval '1 day'
group by index, pricedate

其他选项有min(price)、max(price)等。如果所有的价格都相同,那么min()max()和avg()将返回相同的值>某些数据库有first(),它从数据库认为是“first”的任何行返回值(根据数据库的不同,这可能没有帮助)--编辑——如果您使用count(pricedate)和'groupbypricedate',那么您将只得到1的计数。也许您误解了'between'子句(它用于限制数据,而不是计算日期之间的差异)。尝试

select (pricedate - date_trunc('month',pricedate)) as counta

(目前没有分组),看看这是否能给你一个更接近的答案。

k7fdbhmy

k7fdbhmy2#

始终将数据作为纯文本,而不是图像,以便我们都可以复制/粘贴。
我总共花了15分钟重新键入输入数据并重新格式化。
但是,现在我知道了:
您需要的是运行总和:如果是星期一,则为1;如果是周末,则为0。这就是普通的olap,窗口功能,功能。欢迎使用sql-99。。。
来吧。
输入:

WITH
-- your input as in-line table, typed manually ...
input(index,price,pricedate,counta_in) AS (
          SELECT 'A',NULL::INT,DATE '2020-05-01', 1
UNION ALL SELECT 'A',        5,DATE '2020-05-04', 2
UNION ALL SELECT 'A',        4,DATE '2020-05-05', 3
UNION ALL SELECT 'A',        6,DATE '2020-05-06', 4
UNION ALL SELECT 'A',        4,DATE '2020-05-07', 5
UNION ALL SELECT 'A',        4,DATE '2020-05-11', 6
UNION ALL SELECT 'A',        6,DATE '2020-05-12', 7
UNION ALL SELECT 'A',        7,DATE '2020-05-13', 8
UNION ALL SELECT 'A',        8,DATE '2020-05-14', 9
UNION ALL SELECT 'A',        8,DATE '2020-05-15',10
UNION ALL SELECT 'A',        8,DATE '2020-05-18',11
UNION ALL SELECT 'A',        4,DATE '2020-05-19',12
UNION ALL SELECT 'A',        5,DATE '2020-05-20',13
UNION ALL SELECT 'A',        3,DATE '2020-05-21',14
UNION ALL SELECT 'A',        5,DATE '2020-05-22',15
UNION ALL SELECT 'A',        4,DATE '2020-05-26',16
UNION ALL SELECT 'A',        5,DATE '2020-05-27',17
UNION ALL SELECT 'A',        3,DATE '2020-05-28',18
UNION ALL SELECT 'A',        5,DATE '2020-05-29',19
UNION ALL SELECT 'A',        4,DATE '2020-06-01', 1
UNION ALL SELECT 'A',        6,DATE '2020-06-02', 2
UNION ALL SELECT 'A',        4,DATE '2020-06-03', 3
UNION ALL SELECT 'A',        4,DATE '2020-06-04', 4
UNION ALL SELECT 'A',        5,DATE '2020-06-05', 5
UNION ALL SELECT 'A',        4,DATE '2020-06-08', 6
UNION ALL SELECT 'A',        6,DATE '2020-06-09', 7
)

实际选择,从上面的输入中选择:

-- acutal query starts here. counta_out is my OLAP expression.
SELECT
  *
, SUM(CASE WHEN DAYOFWEEK_ISO(pricedate) < 6 THEN 1 ELSE 0 END)
  OVER(PARTITION BY MONTH(pricedate) ORDER BY pricedate) 
  AS counta_out
FROM input;

以及结果,包括控制列和结果列:

index | price | pricedate  | counta_in | counta_out 
------+-------+------------+-----------+------------
A     |       | 2020-05-01 |         1 |          1
A     |     5 | 2020-05-04 |         2 |          2
A     |     4 | 2020-05-05 |         3 |          3
A     |     6 | 2020-05-06 |         4 |          4
A     |     4 | 2020-05-07 |         5 |          5
A     |     4 | 2020-05-11 |         6 |          6
A     |     6 | 2020-05-12 |         7 |          7
A     |     7 | 2020-05-13 |         8 |          8
A     |     8 | 2020-05-14 |         9 |          9
A     |     8 | 2020-05-15 |        10 |         10
A     |     8 | 2020-05-18 |        11 |         11
A     |     4 | 2020-05-19 |        12 |         12
A     |     5 | 2020-05-20 |        13 |         13
A     |     3 | 2020-05-21 |        14 |         14
A     |     5 | 2020-05-22 |        15 |         15
A     |     4 | 2020-05-26 |        16 |         16
A     |     5 | 2020-05-27 |        17 |         17
A     |     3 | 2020-05-28 |        18 |         18
A     |     5 | 2020-05-29 |        19 |         19
A     |     4 | 2020-06-01 |         1 |          1
A     |     6 | 2020-06-02 |         2 |          2
A     |     4 | 2020-06-03 |         3 |          3
A     |     4 | 2020-06-04 |         4 |          4
A     |     5 | 2020-06-05 |         5 |          5
A     |     4 | 2020-06-08 |         6 |          6
A     |     6 | 2020-06-09 |         7 |          7
t9eec4r0

t9eec4r03#

使用GROUPBY子句时,需要指定select中使用的所有列。那么查询是

SELECT priceindex, price, pricedate, count(pricedate) AS counta
FROM myDB
WHERE pricedate BETWEEN date_trunc('month',pricedate) and pricedate + interval '1 day'
GROUP BY priceindex, price, pricedate

您也可以尝试使用distinct子句而不是GROUPBY。

SELECT DISTINCT priceindex, price, pricedate, count(pricedate) AS counta
FROM myDB 
WHERE pricedate BETWEEN date_trunc('month',pricedate) and pricedate + interval '1 day'
dced5bon

dced5bon4#

SELECT priceindex, price, pricedate
        , row_number() OVER
                (PARTITION BY priceindex, date_trunc('month', pricedate)
                ORDER BY pricedate) AS counta 
FROM myDB
        ;

相关问题