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 / 问题

问题[group-by](dba)

Martin Hope
Canelo Digital
Asked: 2024-10-31 23:41:48 +0800 CST

在金额列上使用 GROUP BY 时连接年份列的数据(MySQL)

  • 3

我有一张表,从中我可以生成按年份分组并计算金额的视图,我想知道是否可以以某种方式包含聚合日期或月份的“字符串总和”或“字符串连接”。

例如:这是基表

ID | date | year | month | amount

这是实际视图

ID | year | sum(amount)

我正在寻找的是一个附加字段,将月份连接到 03,05,11(例如或类似的东西),如果一年汇总了 3 月、5 月和 11 月的数据

ID | year | sum(amount) | list_of_months

这是可能的吗?或者我必须创建帮助视图来汇总这一点?

编辑:我可以自己回答:Group_concat 帮助,如下面的答案所示

group-by
  • 1 个回答
  • 19 Views
Martin Hope
Jonathon Doesen
Asked: 2022-09-01 10:27:19 +0800 CST

按单个成员选择组并对其他值求和

  • 2

使用 MySql 5.7.34 并有一个表 groups_members,有 4 列

ID 团体 成员 组织
1 一个 鲍勃 苹果
2 一个 苏珊 苹果
3 一个 乔 苹果
4 乙 史蒂夫 微软
5 乙 麦克风 微软
6 乙 鲍勃 微软
7 C 苏珊 苹果
8 C 鲍勃 苹果
9 C 乔 苹果

我想选择同时拥有 Bob 和 Joe 作为成员的所有组,并且该组织仅是 Apple,每个组在结果中只有一行。

预期成绩:

团体
一个
C

如果可能的话,理想情况下,我还希望从同一查询中的另一个表中为每个组选择和求和一些值。基本上得到所有以 Bob 和 Joe 作为成员的团体,并获得该团体的综合积分和里程:

ID 团体 积分 英里
1 一个 10 100
1 C 10 150
1 一个 10 100
1 乙 10 200
1 乙 10 100

所以理想的预期结果实际上是:

团体 积分 英里
一个 20 200
C 10 150

我可以想出一些方法来使用多个查询和一些应用程序逻辑来做到这一点。但是,如果可以通过一个查询完成所有操作,那就太好了。

mysql group-by
  • 2 个回答
  • 29 Views
Martin Hope
Gokul
Asked: 2022-08-25 06:16:52 +0800 CST

为什么 GROUP BY 子句需要该值?

  • -2

当我们在任何关系数据库中编写“分组依据”时,语法总是需要这些值。难道我们不能通过不强制提供按值分组来使语法简单一点吗?默认情况下,选择中提到的任何列都将被分组。

不过有几点需要考虑

  • 不包括选择中的聚合列
  • 如果您想按某些列分组但不想选择它们,那么您可以在 group by 子句中提供值

问这个问题以了解是否有任何原因说明为什么 group by cluase 总是需要价值,或者我可能遗漏了有关 SQL 语法语义的其他原因。

postgresql group-by
  • 1 个回答
  • 34 Views
Martin Hope
Moshe Katz
Asked: 2022-08-09 13:47:00 +0800 CST

事件数组对的聚合查询

  • 2

db<>fiddle用于下面的所有数据和查询

我有一个events具有以下结构的表:

create table events (
    correlation_id char(26) not null,
    user_id        bigint,
    task_id        bigint not null,
    location_id    bigint,
    type           bigint not null,
    created_at     timestamp(6) with time zone not null,
    constraint events_correlation_id_created_at_user_id_unique
        unique (correlation_id, created_at, user_id)
);

此表包含正在执行的任务的记录,如下所示:

相关标识 用户身份 task_id location_id 类型 created_at
01CN4HP4AN0000000000000001 4 58 30 0 2018-08-17 18:17:15.348629
01CN4HP4AN0000000000000001 4 58 30 1 2018-08-17 18:17:22.852299
01CN4HP4AN0000000000000001 4 58 30 99 2018-08-17 18:17:25.535593
01CN4J9SZ80000000000000003 4 97 30 0 2018-08-17 18:28:00.104093
01CN4J9SZ80000000000000003 4 97 30 99 2018-08-17 18:29:09.016840
01CN4JC1430000000000000004 4 99 30 0 2018-08-17 18:29:12.963264
01CN4JC1430000000000000004 4 99 30 99 2018-08-17 18:32:09.272632
01CN4KJCDY0000000000000005 139 97 30 0 2018-08-17 18:50:09.725668
01CN4KJCDY0000000000000005 139 97 30 3 2018-08-17 18:50:11.842000
01CN4KJCDY0000000000000005 139 97 30 99 2018-08-17 18:51:42.240895
01CNC4G1Y40000000000000008 139 99 30 0 2018-08-20 17:00:40.260430
01CNC4G1Y40000000000000008 139 99 30 99 2018-08-20 17:00:47.583501

带有 的行type = 0表示任务的开始,带有 的行type = 99表示任务的结束。(其他值表示与此问题无关的其他内容,但为了完整起见,此处包含两个示例行。)

每个task_id对应于tasks表中的一行。任务表中唯一与该问题相关的其他字段称为inprogress_status,它可以是1or 2,分别表示Opening task和Closing task。

我最初被要求提供一个查询,该查询将返回按开始日期和位置排序的任务列表,其中一行包含每个任务的开始 ( type = 0) 和结束 ( type = 99)。

这是我曾经这样做的查询:

SELECT e.created_at::DATE, e.location_id, e.task_id
     , CASE t.inprogress_status WHEN 2 THEN 'CLOSE' WHEN 1 THEN 'OPEN' END AS task_type
     , e.correlation_id
     , json_object_agg(e.type, json_build_object('timestamp', e.created_at, 'user_id', e.user_id)) AS events
FROM events e
JOIN tasks t on e.task_id = t.id
WHERE e.type IN (0, 99)
AND t.inprogress_status IN (1, 2)
group by created_at::DATE, location_id, task_id, correlation_id, inprogress_status
ORDER BY 1, 2, 3;

这是使用上面显示的数据进行查询的结果:

created_at location_id task_id 任务类型 相关标识 事件
2018-08-17 30 58 打开 01CN4HP4AN0000000000000001 {"0": {"timestamp": "2018-08-17T18:17:15.348629+00:00", "user_id": 4}, "99": {"timestamp": "2018-08-17T18:17:25.535593+00:00", "user_id": 4} }
2018-08-17 30 97 关 01CN4J9SZ80000000000000003 {"0": {"timestamp": "2018-08-17T18:28:00.104093+00:00", "user_id": 4}, "99": {"timestamp": "2018-08-17T18:29:09.01684+00:00", "user_id": 4} }
2018-08-17 30 99 打开 01CN4JC1430000000000000004 { "0": {"timestamp": "2018-08-17T18:29:12.963264+00:00", "user_id": 4}, "99": {"timestamp": "2018-08-17T18:32:09.272632+00:00", "user_id": 4} }
2018-08-17 30 97 关 01CN4KJCDY0000000000000005 { "0": {"timestamp": "2018-08-17T18:50:09.725668+00:00", "user_id": 139}, "99": {"timestamp": "2018-08-17T18:51:42.240895+00:00", "user_id": 139} }
2018-08-20 30 99 打开 01CNC4G1Y40000000000000008 { "0": {"timestamp": "2018-08-20T17:00:40.26043+00:00", "user_id": 139}, "99" : {"timestamp": "2018-08-20T17:00:47.583501+00:00", "user_id" : 139} }

在上面的例子中,task_id 58and 99haveinprogress_status = 1和task_id 97has inprogress_status = 2。

现在我被要求修改返回的数据结构,以便它也可以聚合inprogress_status,并将行作为 OPEN+CLOSE 事件对返回。

为了弄清楚如何构建它,我首先尝试获取这种格式(我真正想要的最终格式如下):

created_at location_id 事件
2018-08-17 30 {"OPEN": [{"correlation_id": "01CN4HP4AN0000000000000001", "0" : {"timestamp" : "2018-08-17T18:17:15.348629+00:00", "user_id" : 4}, "99" : {"timestamp" : "2018-08-17T18:17:25.535593+00:00", "user_id" : 4} }, {"OPEN": {"correlation_id": "01CN4JC1430000000000000004", "0" : {"timestamp" : "2018-08-17T18:29:12.963264+00:00", "user_id" : 4}, "99" : {"timestamp" : "2018-08-17T18:32:09.272632+00:00", "user_id" : 4} }], "CLOSE": [{"correlation_id": "01CN4J9SZ80000000000000003", "0" : {"timestamp" : "2018-08-17T18:28:00.104093+00:00", "user_id" : 4}, "99" : {"timestamp" : "2018-08-17T18:29:09.01684+00:00", "user_id" : 4} }, { "correlation_id": "01CN4KJCDY0000000000000005", "0" : {"timestamp" : "2018-08-17T18:50:09.725668+00:00", "user_id" : 139}, "99" : {"timestamp" : "2018-08-17T18:51:42.240895+00:00", "user_id" : 139} }]}
2018-08-20 30 {"OPEN": [{"correlation_id": "01CNC4G1Y40000000000000008", "0" : {"timestamp" : "2018-08-20T17:00:40.26043+00:00", "user_id" : 139}, "99" : {"timestamp" : "2018-08-20T17:00:47.583501+00:00", "user_id" : 139} }], "CLOSE": null}

这是我写的第一个查询,试图使这项工作:

WITH grouped_events AS (
    SELECT e.created_at::DATE AS created_date,
        location_id,
        task_id,
        CASE t.inprogress_status WHEN 2 THEN 'CLOSE' WHEN 1 THEN 'OPEN' END AS task_type,
        jsonb_build_object('id', e.correlation_id) ||
                jsonb_object_agg(type, jsonb_build_object('timestamp', e.created_at, 'user_id', user_id)) AS events
    FROM events e
    JOIN tasks t on e.task_id = t.id
    WHERE type IN (0, 99)
    AND inprogress_status IN (1, 2)
    GROUP BY e.created_at::DATE, location_id, task_id, correlation_id, t.inprogress_status
)
SELECT created_date, location_id, json_object_agg(task_type, events)
FROM grouped_events
GROUP BY 1, 2
ORDER BY 1, 2

问题是这会产生无效的 JSON。具有多个相同的键:

{
    "OPEN": {
        "0": { "user_id": 4, "timestamp": "2018-08-17T18:29:12.963264+00:00" },
        "99": { "user_id": 4, "timestamp": "2018-08-17T18:32:09.272632+00:00" },
        "id": "01CN4JC1430000000000000004"
    },
    "OPEN": {
        "0": { "user_id": 4, "timestamp": "2018-08-17T18:17:15.348629+00:00" },
        "99": { "user_id": 4, "timestamp": "2018-08-17T18:17:25.535593+00:00" },
        "id": "01CN4HP4AN0000000000000001"
    },
    // ... etc.
}

我发现这个查询以上面显示的格式返回数据:

WITH grouped_events1 AS (
    SELECT e.created_at::DATE AS created_date,
        location_id,
        task_id,
        CASE t.inprogress_status WHEN 2 THEN 'CLOSE' WHEN 1 THEN 'OPEN' END AS task_type,
        jsonb_build_object('id', e.correlation_id) ||
                jsonb_object_agg(type, jsonb_build_object('timestamp', e.created_at, 'user_id', user_id)) AS events
    FROM events e
    JOIN tasks t on e.task_id = t.id
    WHERE type IN (0, 99)
    AND inprogress_status IN (1, 2)
    GROUP BY e.created_at::DATE, location_id, task_id, correlation_id, t.inprogress_status
), grouped_events2 AS (
    SELECT created_date, location_id, task_type, json_agg(events) AS events
    FROM grouped_events1
    GROUP BY 1, 2, 3
)
SELECT created_date, location_id, json_object_agg(task_type, events)
FROM grouped_events2
GROUP BY 1, 2
ORDER BY 1, 2

但是,我实际需要的格式应该只是将单个 OPEN 与单个 CLOSE 配对,如下所示(每个 OPEN 和紧随其后的 CLOSE):

created_at location_id 事件
2018-08-17 30 {"OPEN": {"correlation_id": "01CN4HP4AN0000000000000001", "0" : {"timestamp" : "2018-08-17T18:17:15.348629+00:00", "user_id" : 4}, "99" : {"timestamp" : "2018-08-17T18:17:25.535593+00:00", "user_id" : 4} }, "CLOSE": {"correlation_id": "01CN4J9SZ80000000000000003", "0" : {"timestamp" : "2018-08-17T18:28:00.104093+00:00", "user_id" : 4}, "99" : {"timestamp" : "2018-08-17T18:29:09.01684+00:00", "user_id" : 4} }}
2018-08-17 30 {"OPEN": {"OPEN": {"correlation_id": "01CN4JC1430000000000000004", "0" : {"timestamp" : "2018-08-17T18:29:12.963264+00:00", "user_id" : 4}, "99" : {"timestamp" : "2018-08-17T18:32:09.272632+00:00", "user_id" : 4} }, "CLOSE": { "correlation_id": "01CN4KJCDY0000000000000005", "0" : {"timestamp" : "2018-08-17T18:50:09.725668+00:00", "user_id" : 139}, "99" : {"timestamp" : "2018-08-17T18:51:42.240895+00:00", "user_id" : 139} }}
2018-08-20 30 {"OPEN": [{"correlation_id": "01CNC4G1Y40000000000000008", "0" : {"timestamp" : "2018-08-20T17:00:40.26043+00:00", "user_id" : 139}, "99" : {"timestamp" : "2018-08-20T17:00:47.583501+00:00", "user_id" : 139} }], "CLOSE": null}

现在我想弄清楚我是否走错了方向,因为我看不出如何从我所拥有的东西中得到我的最终格式。

我接近这个错误吗?我怎样才能得到我正在寻找的结果?

postgresql group-by
  • 1 个回答
  • 46 Views
Martin Hope
Clement
Asked: 2022-06-28 07:37:41 +0800 CST

当不同的值返回 NULL 否则返回值

  • 6

以下是我获得的数据类型的示例(由不同用户收集):

姓名 姓
萌 沫沫
萌 沫沫
杰克 JAJA
杰克 杰基

我想知道两个用户何时为同一个名字收集了不同的姓氏。

我想要得到的输出是:

姓名 姓
萌 沫沫
杰克 无效的

如果所有用户都收集了相同的,我会看到姓氏,如果有差异,我会看到 NULL。

我尝试搜索互联网,但我无法正确描述我正在搜索的内容。

我尝试使用 CASE 请求,但没有成功。

sql-server group-by
  • 5 个回答
  • 752 Views
Martin Hope
chalo
Asked: 2022-05-26 05:33:38 +0800 CST

查找组计数的最大值

  • 0

我正在使用 SQL Server,考虑下表:

内容表

标题 话题 id_user
标题 1 主题1 1
标题 2 主题1 1
标题 3 主题2 2
标题 4 主题1 3
标题 5 主题1 1
标题 6 主题1 3
标题 7 主题2 2

当我运行时,我得到以下信息:

SELECT topic, id_user, COUNT(*) AS total
FROM Content
GROUP BY topic, id_user
ORDER BY total DESC

结果

话题 id_user 全部的
主题1 1 3
主题1 3 2
主题2 2 2

在这种情况下,有两个用户(可能更多)使用 Topic1,我只想显示他们各自 Topic 的总计数值最高的用户

例如得到以下结果:

预期结果

话题 id_user 全部的
主题1 1 3
主题2 2 2

任何线索如何做到这一点?

sql-server group-by
  • 1 个回答
  • 56 Views
Martin Hope
Brylie Christopher Oxley
Asked: 2022-04-18 08:03:43 +0800 CST

如何将一列中的值转换为具有另一列值的列?

  • 3

我有一个具有以下结构的数据库:

日期 角色 类型 期间
2022-04-16 护士 准备食材 45
2022-04-17 护士 打扫 30
2022-04-17 志愿者 打扫 20
2022-04-17 护士 准备食材 60

注意:我事先不知道“类型”列中的值,因为它们是由用户定义的。此外,可以有多个具有重叠日期、角色和类型的行。

我正在使用一个图表库,希望将数据分组如下:

角色 准备食材 打扫
护士 105 30
志愿者 无效的 20

到目前为止,我可以使用以下查询对数据进行分组

select 
    role,
    type, 
    sum(duration) as total_minutes
from work
group by role, type;
角色 类型 总分钟数
护士 打扫 45
护士 准备食材 20
志愿者 打扫 15
志愿者 准备食材 43

如何“透视”/“转置”数据,以便每一行代表一个角色,其中一列包含每种工作类型的分钟总和?

实际上,我想转置类似于 Pandas DataFrame.pivot_table函数的数据,但只使用 SQL。

postgresql group-by
  • 1 个回答
  • 4000 Views
Martin Hope
IBot
Asked: 2022-02-22 15:57:58 +0800 CST

GROUP BY 日期列,然后按自定义白天分组

  • 0

所以我必须根据日期和产品到达的时间对表格进行分组,时间将是:

morning = [5, 6, 7 , 8, 9]
mid_morning = [10, 11]
midday = [12, 13, 14]
evening = [15, 16, 17 ,18 ,19, 20]
night = [21, 22, 23, 0, 1, 2, 3, 4]

这是表格:

 CREATE TABLE inventory (
      inventory_id serial PRIMARY KEY,
      arrive_date date NOT NULL,
      arrive_location character varying NOT NULL,
      thing_type integer NOT NULL,
      quantity integer NOT NULL
    );

INSERT INTO inventory (arrive_date, arrive_location, thing_type, quantity) VALUES
  ('2018-05-30 05:00:00-00', 'location_00', 3, 2)
, ('2018-05-30 06:00:00-00', 'location_00', 3, 8)
, ('2018-05-30 12:50:00-00', 'location_00', 5, 2)
, ('2018-05-30 13:40:00-00', 'location_00', 1, 3)
, ('2018-05-31 13:00:00-00', 'location_00', 4, 7)
, ('2018-05-31 18:00:00-00', 'location_00', 2, 3)
;

期望的结果是得到这个表结果:

preprocess_id 到达日期 到达时间天 到达位置 数据
33 2018-05-30 0 位置_00 {“3”:10}
34 2018-05-30 2 位置_00 { "5": 2, "1": 3 }
36 2018-05-31 2 位置_00 {“4”:7}
37 2018-05-31 4 位置_00 {“2”:3}

我只有按天分组的当前查询小提琴,是否可以有日期然后是白天?

group-by postgresql-13
  • 1 个回答
  • 119 Views
Martin Hope
HeyJude
Asked: 2021-11-15 06:45:03 +0800 CST

查询以仅过滤具有不同值的分组

  • 1

我需要一个简单的查询,但找不到方法:

我有一张客户购买的服务表,其中不同的客户可能会购买相同的服务(很简单),每个客户可能有几个活跃或不活跃的服务:

ServiceId  IsActive ServiceCustomerId
815        0        111
715        0        111
985        1        222
815        1        333
475        1        111
985        1        111
815        1        222

我想获取同时拥有活动和非活动服务的客户的记录,因此输出将是(ServiceId可以省略):

IsActive ServiceCustomerId
0        111
1        111

我所拥有的是:

select ServiceCustomerId,IsActive from Services 
group by ServiceCustomerId, IsActive
having count(IsActive) > 1
order by ServiceCustomerId

这使:

IsActive ServiceCustomerId
0        111
1        111
1        222

演示可以在这里看到。

如何仅过滤同时具有这两个IsActive组的人?

sql-server group-by
  • 1 个回答
  • 88 Views
Martin Hope
Sudhir Sharma
Asked: 2021-11-14 17:11:36 +0800 CST

拥有和分组依据子句

  • 0

我昨天遇到了这个问题。我正在寻找一个解释。

关于 SQL 查询,下列哪项陈述是正确的?

P :即使没有 GROUP BY 子句,SQL 查询也可以包含 HAVING 子句

问:SQL 查询只有在有 GROUP BY 子句时才能包含 HAVING 子句

R : GROUP BY 子句中使用的所有属性都必须出现在 SELECT 子句中

S :并非 GROUP BY 子句中使用的所有属性都需要出现在 SELECT 子句中

(A) P 和 R。
(B) P 和 S。
(C) Q 和 R。
(D) Q 和 S。

我选择 A 作为答案。但实际上 B 是正确答案。

我想知道有些网站提到 R 是正确的,而其他网站说 S 是正确的。后两者之间哪个说法是正确的?

group-by
  • 1 个回答
  • 112 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