AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[window-functions](dba)

Martin Hope
michaelosmith
Asked: 2022-08-30 03:20:33 +0800 CST

有间隔的日期范围的累积运行 SUM

  • 2

我正在寻求帮助,以获得位于不同行的两个日期之间差异的运行总和。

表看起来像:

client_id 姓名 autopay_status 合同编号 开始日期 结束日期
1 合同一 不活跃 1111 “2019-08-30” “2020-02-29”
1 合同一 不活跃 1112 “2020-02-29” “2020-08-29”
1 合同一 积极的 1113 “2020-08-29” “2021-02-28”
2 合同 2 不活跃 2221 “2019-08-30” “2020-02-29”
2 合同 2 不活跃 2222 “2020-02-29” “2020-08-29”
2 合同 2 积极的 2223 “2020-08-29” “2021-02-28”
3 合同 3 不活跃 3331 “2019-08-30” “2020-02-29”
3 合同 3 不活跃 3332 “2020-03-29” “2020-09-29”
3 合同 3 不活跃 3333 “2020-09-29” “2021-03-28”
3 合同 3 积极的 3334 “2021-03-28” “2021-09-28”

我有一个查询,查看前一个 end_date,如果它在一天之内,那么这是一份持续合同。

SELECT
    case when
        (start_date - coalesce(lag(end_date) over (partition by client_id order by end_date), end_date)::date)::int <= 1 then true
         else false
    end as continous_contract,
    end_date - start_date as contract_days,
    client_id,
    contract_id,
    autopay_status,
    start_date,
    end_date
FROM
    client_contracts
ORDER BY
    client_id, start_date

这增加了两个额外的别名列。

连续合同 合同天数 client_id 姓名 autopay_status 合同编号 开始日期 结束日期
真的 183 3 合同 3 不活跃 3331 “2019-08-30” “2020-02-29”
错误的 184 3 合同 3 不活跃 3332 “2020-03-29” “2020-09-29”
真的 183 3 合同 3 不活跃 3333 “2020-09-29” “2021-03-28”
真的 182 3 合同 3 积极的 3334 “2021-03-28” “2021-09-28”

我的目标是总结客户拥有连续合同的天数,因此上述示例的表格如下所示:

sum_days 连续合同 合同天数 client_id
183 真的 183 3
184 错误的 184 3
367 真的 183 3
549 真的 182 3
733 真的 184 3
181 错误的 181 3

我将下面的查询放在一起,但它只总结了前两个值。

SELECT
*
FROM
(
    SELECT
        *,
        case
            when cc.continuous_contract = true then
                cc.contract_days + coalesce(lag(cc.contract_days) over (partition by cc.client_id), 1)
            else cc.contract_days
        end as added_contract_days
    FROM (
        SELECT
            case when
                (start_date - coalesce(lag(end_date) over (partition by client_id order by end_date), end_date)::date)::int <= 1 then true
                 else false
            end as continuous_contract,
            end_date - start_date as contract_days,
            client_id,
            contract_id,
            autopay_status,
            start_date,
            end_date
        FROM
            client_contracts
        ) as cc
    ) as ccc

我很高兴改变任何事情来完成这项工作。

Fiddle 用于协助查看数据和结构: Fiddle

postgresql window-functions
  • 1 个回答
  • 46 Views
Martin Hope
Jason
Asked: 2022-08-02 14:45:36 +0800 CST

几个月内的累计金额

  • 2

我有这张桌子:

月代表 水果 收获
2021-09-01 139 139
2021-10-01 143 11
2021-11-01 152 14
2021-12-01 112 9
2022-01-01 133 10
2022-02-01 145 12
2022-03-01 123 5
2022-04-01 111 4
2022-05-01 164 9
2022-06-01 135 12
2022-07-01 124 14
2022-08-01 144 18
2022-09-01 111 111
2022-10-01 108 13
2022-11-01 123 7
2022-12-01 132 20

我想创建一个名为sold基于计算的新列 - 这将是harvested几个月(9 月至 6 月)内的运行总和。每年 9 月,sold将始终为 1(或 100%)。2021 年 10 月的计算将是fruits/ ( harvested+ harvested_Nov) = 143 / 11 + 139。

对于 2021 年的其余月份,遵循相同的格式:fruits/ ( harvested+ harvested_until_Sep) --> 这将是一个运行总和,从您所在的月份开始,到上一年的 9 月结束。

2022 年的另一个示例是 2022 年 3 月的计算 = fruits/ ( harvested+ harvested_Feb_2022+ harvested_Jan_2022+ harvested_Dec_2021+ harvested_Nov_2021+ harvested_Oct_2021+ harvested_Sep_2021) = 123 / (5+12+10+9+14+11+139)。

该表应如下所示:

月代表 水果 收获 卖
2021-09-01 139 139 1
2021-10-01 143 11 0.95
2021-11-01 152 14 0.93
2021-12-01 112 9 0.65
2022-01-01 133 10 ..
2022-02-01 145 12 ..
2022-03-01 123 5 ..
2022-04-01 111 4 ..
2022-05-01 164 9 ..
2022-06-01 135 12 ..
2022-07-01 124 14 无效的
2022-08-01 144 18 无效的
2022-09-01 111 111 1
2022-10-01 108 13 0.87
2022-11-01 123 7 0.94
2022-12-01 132 20 ..

我试过这个:

select 
    month_rep,
    fruits,
    harvested,
    case when extract(month from "month_rep") in (7, 8) then null
         when extract(month from "month_rep") = 9 then 1
        else ROUND(fruits / sum(harvested) over (order by month_rep), 2) end sold
from my_table 

这很好用,但只有当我有 2022 年 9 月之前的数据时。我希望 Jul 和 Aug 为 null sold- 这很有效。2022 年 8 月之后,2022 年 9 月应该是一个新的时期,其中sold1。在那之后,2022 年 10 月将计算为fruits/ ( harvested+ harvested_Sep_2022) - 我们从 2022 年 9 月 2 日到 2023 年 6 月的第二个时期开始一个新时期。

有没有办法对这些“时期”进行分组并对其进行汇总?我可能需要找到一种方法来对期间进行分组并从中进行分区。

postgresql window-functions
  • 1 个回答
  • 109 Views
Martin Hope
Healyhatman
Asked: 2022-02-14 16:26:25 +0800 CST

获取由具有连续值计数的外键分组的行

  • 2

我有一个带有 、 和 的表的transactionsSQL Server 数据库。client_iddateis_cancelled

我正在尝试获取在标记为 is_cancelled的行中有 3 个或更多事务的 client_ids ,以及 in_a_row 计数。我已经得到了以下内容,当 is_cancelled 支持是连续的时,is_same 的值为 1,并且取消的事务总数为 1(这不是我所需要的)

SELECT 
client_id,
date,
is_same,
SUM(is_same) OVER (PARTITION BY client_id ORDER BY date) AS sum_same,
transCancelled
FROM
(
    SELECT
    client_id,
    LAG(is_cancelled) OVER (PARTITION BY client_id ORDER BY date) AS previous_cancelled,
    CASE 
        WHEN is_cancelled = LAG(is_cancelled) OVER (PARTITION BY client_id ORDER BY date)
        THEN 1
        ELSE 0
    END as is_same,
    date,
    is_cancelled
    FROM transactions
    WHERE deleted_at IS NULL -- Ignore soft-deleted rows
) AS t_01
WHERE previous_cancelled = 1
ORDER BY date

摆弄示例数据:https ://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=a0c9b12203ab2d0c83f73604ccc9d0a0

预期数据(client_id,count) 1, 3 3, 6

sql-server window-functions
  • 1 个回答
  • 182 Views
Martin Hope
Carol.Kar
Asked: 2021-12-26 11:30:04 +0800 CST

获取行的排名

  • 1

我正在使用mysql Ver 14.14 Distrib 5.7.21, for Linux (x86_64).

我有一个表推荐:

CREATE TABLE `referrals` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `referred_by` bigint(20) unsigned DEFAULT NULL,
  `referral_token` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `referrals_email_unique` (`email`)
);

在表格中,您基本上插入了人和推荐人。

我创建了以下排行榜:

select
        referred_by,
        count(referred_by) as referred_by_count,
            @curRank := @curRank + 1 AS rank
from
        referrals r,
    (
    SELECT
        @curRank := 0) o
group by
        referred_by
order by
        referred_by_count DESC;

这给了我:

由......推荐 参考计数 秩
10 3 3
2 2 1
3 2 2
13 2 5
11 2 6
15 1 8
12 1 9
4 1 4
9 1 7

但是,我想得到:

由......推荐 参考计数 秩
10 3 1
2 2 2
3 2 3
13 2 4
11 2 5
15 1 6
12 1 7
4 1 8
9 1 9

在 DB Fiddle 上查看

我使用 faker php 插件创建了以下dbfiddle 。

我尝试使用 mysqlRANK()功能。但是,我正在努力如何正确使用它。

感谢您的回复!

mysql window-functions
  • 2 个回答
  • 104 Views
Martin Hope
r2k2
Asked: 2021-08-03 11:24:25 +0800 CST

每个非空值之前的空行数

  • 0

我需要回答以下问题:

在客户打开电子邮件之前,平均发送电子邮件的次数是多少?我知道我需要计算每个 Open_Date 之间的行数,以便获得每次打开之间发送的电子邮件数量。我意识到我需要为此添加 row_number () 函数,但我似乎无法在第二个屏幕截图中找到所需的列。

需要记住的一点是,我需要每个电子邮件地址平均获得一个“CounttilOpens”。在下面的示例中,我有两个不同的电子邮件地址以及它们各自的发送和打开日期,并且我需要查询来为每个电子邮件地址独立运行。

我的数据结构如下:

在此处输入图像描述

我需要一个查询来帮助我获得一个像这样的新列,该列会针对每个电子邮件地址和每个开放日期间隔重新启动:

在此处输入图像描述

partitioning window-functions
  • 1 个回答
  • 359 Views
Martin Hope
jsf80238
Asked: 2021-07-02 14:57:33 +0800 CST

计算给定时间的累积金额

  • 0

我想找出在 P 小时内花费超过 D 美元的客户。假设 D=10 美元,P=48。然后在下面的交易数据中:

CUSTOMER         STAMP        AMOUNT
--------         -----        ------
   A     2021-06-02 00:22:53    1.44
   A     2021-06-02 06:24:17    1.51
   A     2021-06-03 07:09:45    2.73
   A     2021-06-03 15:57:30    3.92
   A     2021-06-04 06:41:21    1.83
   B     2021-06-01 02:50:22    2.65
   B     2021-06-03 07:01:36    4.05
   B     2021-06-04 05:20:10    3.30
   B     2021-06-04 09:53:53    2.64
   B     2021-06-04 14:54:00    2.26
   C     2021-06-01 16:01:38    2.61
   C     2021-06-01 23:38:25    1.16
   C     2021-06-02 14:41:02    2.82
   C     2021-06-03 00:28:37    1.54
   C     2021-06-03 02:06:46    1.19
   C     2021-06-04 17:16:29    2.05

客户 B 符合标准,客户 A 和 C 不符合(即使他们的总支出 > 10 美元)。

我知道如何使用窗口函数,但在这种情况下,我事先不知道窗口应该有多大。


我认为答案是这样的:

select
  customer
, stamp
, amount
, amount > coalesce(sum(amount) over (order by extract('epoch_second', stamp)
range between 2*24*60*60 preceding and current row), 0) as is_alert
from t
where amount is not null
order by stamp

但我的数据库是雪花,它似乎不支持这种语法。该页面说:

对于累积窗口框架: ... RANGE 类似于 ROWS,除了它只计算与当前行具有相同值的行的结果(根据指定的 ORDER BY 子句)。

window-functions snowflake
  • 1 个回答
  • 36 Views
Martin Hope
a_dog_with_no_master
Asked: 2021-06-25 02:23:18 +0800 CST

选择间隔前的第一个时间戳,如果没有合适的间隔,则选择当天的最后一个时间戳

  • 1

我有一个 TIMESTAMP 列:

dates
2021-06-24 05:47:05
2021-06-24 09:47:05
2021-06-24 13:47:05
2021-06-24 17:47:05

我想选择在同一天的下一个时间戳之前 3 小时或更长时间的给定日期的第一个时间戳。

expected output:

2021-06-24 05:47:05

但是,如果没有时间戳比任何其他时间戳(在给定日期)早 3 小时以上,则应返回当天的最后一个时间戳。

postgresql window-functions
  • 1 个回答
  • 399 Views
Martin Hope
kn3l
Asked: 2021-06-01 00:23:58 +0800 CST

“前 15 行和后 15 行之间的行”的含义

  • -1
WITH trips_by_day AS
                      (
                      SELECT DATE(trip_start_timestamp) AS trip_date,
                          COUNT(*) as num_trips
                      FROM `bigquery-public-data.chicago_taxi_trips.taxi_trips`
                      WHERE trip_start_timestamp >= '2016-01-01' AND trip_start_timestamp < '2018-01-01'
                      GROUP BY trip_date
                      ORDER BY trip_date
                      )
                      SELECT trip_date,
                          avg(num_trips)
                          OVER (
                               order by trip_date
                               rows between 15 preceding and 15 following
                               ) AS avg_num_trips
                      FROM trips_by_day

谁能给我解释一下的意思rows between 15 preceding and 15 following?

sql-server window-functions
  • 2 个回答
  • 120 Views
Martin Hope
Daniel Müller
Asked: 2021-05-19 04:35:20 +0800 CST

在SQL中获取具有特定值的行之前的行

  • 1

我有一个如下表,其中用户操作与时间戳一起存储。我的目标是识别在特定操作(名为reference_action)之前发生的操作并计算这些操作的数量以查看哪些操作在特定操作之前发生以及它们是如何分布的。

我知道像 LAG() 这样的窗口函数,我可以在其中获取某一行之前的行,但不知道如何包含像WHERE action_name = "reference_action".

查询引擎是 Presto,表是 Hive 表,但我最感兴趣的是一般的 SQL 方法,因此这无关紧要。

会议 动作名称 时间戳
1 “一些动作” 1970-01-01 00:01:00
1 “一些动作” 1970-01-01 00:02:00
1 “一些动作” 1970-01-01 00:03:00
1 “desired_action1” 1970-01-01 00:04:00
1 “reference_action” 1970-01-01 00:05:00
1 “一些动作” 1970-01-01 00:06:00
1 “一些动作” 1970-01-01 00:07:00
2 “一些动作” 1970-01-01 01:23:00
2 “一些动作” 1970-01-01 02:34:00
2 “desired_action1” 1970-01-01 03:45:00
2 “reference_action” 1970-01-01 04:56:00
2 “一些动作” 1970-01-01 05:58:00
3 “一些动作” 1970-01-01 01:23:00
3 “一些动作” 1970-01-01 02:34:00
3 “desired_action2” 1970-01-01 03:45:00
3 “reference_action” 1970-01-01 04:56:00
3 “一些动作” 1970-01-01 05:58:00

结果应如下所示:

行动 数数
“desired_action1” 2
“desired_action2” 1

有两行,其中“desired_action1”直接跟在“reference_action”行之后,当按 排序时timestamp,因此计数为 2。同样的逻辑适用于为什么“desired_action2”的计数为 1。

目标是了解用户在购买之前做了什么(购买 = reference_action)。要了解他之前做了什么,我想查找购买之前发生的操作。因此,我需要在reference_action 之前知道行中的action_name。required_actions 必须被计算,reference_actions 只是我想要计算的操作之后的行,用于确定应该计算哪些值。

sql-standard window-functions
  • 1 个回答
  • 135 Views
Martin Hope
vmachacek
Asked: 2021-04-22 02:51:06 +0800 CST

Postgres SUM over PARTITION BY “tolerate” null 值

  • 0

我有一个视图,它根据PARTITION BY子句计算前一行的值的滚动总和,我需要指出PARTITION BY子句中的一个字段可以有空值。

sum(s."QuantityChange") OVER (PARTITION BY s."LocationId", s."PartId", s."SupplierFacilityId" ORDER BY s."DueDate" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS "RunningSum"

有时SupplierFacilityId为空,这很好,它仍应包含在sum()计算中。

Postgres可以做到这一点吗?

postgresql window-functions
  • 2 个回答
  • 2279 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve