标签: group-by

按不同的时间范围按非唯一键对数据进行分组

我在 Oracle 表中有如下数据:

PROJ_NBR     STATUS    START_DT        
AL20         AC        1/14/2010 4:31        
AL20         AC        1/14/2010 4:32        
AL20         AC        1/14/2010 4:32        
AL20         DE        1/14/2010 4:34        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         AC        3/4/2010 4:31        
AL20         AC        3/4/2010 4:39        
AL20         AC        3/21/2010 13:24        
AL20         AC        2/4/2011 13:54        --year changes …
Run Code Online (Sandbox Code Playgroud)

oracle group-by gaps-and-islands

6
推荐指数
1
解决办法
670
查看次数

如何计算每组中第一行和最后一行字段值的差异

我有这样结构的表:

+-------+------------------+
| Value |       Date       |
+-------+------------------+
|    10 | 10/10/2010 10:00 |
|    11 | 10/10/2010 10:15 |
|    15 | 10/10/2010 10:30 |
|    15 | 10/10/2010 10:45 |
|    17 | 10/10/2010 11:00 |
|    18 | 10/10/2010 11:15 |
|    22 | 10/10/2010 11:30 |
|    30 | 10/10/2010 11:45 |
+-------+------------------+
Run Code Online (Sandbox Code Playgroud)

目前我正在使用 group by 来获取 min、max、avg 来获取这样的每小时报告:

+-----+-----+-------+------------------+
| min | max |  avg  |       Date       |
+-----+-----+-------+------------------+
|  10 |  15 | 12.75 …
Run Code Online (Sandbox Code Playgroud)

sql-server aggregate t-sql group-by

6
推荐指数
1
解决办法
3万
查看次数

当依靠未记录的行为来确定 MySQL 为 GROUP BY 操作中的隐藏列选择的值时,存在哪些极端情况?

GROUP BYHAVING与隐藏列,MySQL手册文件(强调):

MySQL 扩展了 的使用,GROUP BY以便选择列表可以引用GROUP BY子句中未命名的非聚合列。这意味着前面的查询在 MySQL 中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在GROUP BY每个组中未命名的每个非聚合列中的所有值都相同时很有用。服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则选择的值是不确定的。

尽管开发人员发出了这个明确的警告,但有些人继续依赖未记录的行为来确定将从隐藏列中选择的值。

特别是,MySQL似乎经常从每个组中选择“第一”记录(其中“第一”的概念本身没有记录,例如某些存储引擎上的最旧记录或根据应用于物化表的某种排序顺序从子查询)。我已经看到这个被利用来检索,例如,分组最大值:

SELECT * FROM (
  SELECT * FROM my_table ORDER BY sort_col DESC
) t GROUP BY group_col
Run Code Online (Sandbox Code Playgroud)

为了完整起见,可以通过简单的连接以标准和文档化的方式完成相同的操作:

SELECT * FROM my_table NATURAL JOIN (
  SELECT   group_col, MAX(sort_col) sort_col
  FROM     my_table
  GROUP BY group_col
) t
Run Code Online (Sandbox Code Playgroud)

我相信人们永远不应该依赖无证行为,因为可能存在无法预见的极端情况导致该行为中断。例如,在GROUP BY用索引满足操作时,MySQL 对结果进行排序,从而可能选择一个意外的值。

还有哪些极端情况可以打破这种行为?或者它对于生产系统是否足够可靠?

mysql group-by

6
推荐指数
1
解决办法
429
查看次数

按日期分组时甚至返回空组

我有以下查询:

SELECT DISTINCT
           COUNT(CD_BarCode)
           ,CD_Carrier
           ,SUBSTRING(CONVERT(VARCHAR,DT_Arriving,103),1,11) Date
FROM TB_AGIL 
WHERE 
           DT_Arriving >= @date
           AND DT_Arriving < DATEADD(MONTH,+1,@date)
           AND CD_TRACKING = 14
GROUP BY CD_Carrier, SUBSTRING(CONVERT(VARCHAR,DT_Arriving,103),1,11)
ORDER BY Date 
Run Code Online (Sandbox Code Playgroud)

我用它来查看上个月货物移动的结果。结果是按日期分组的cd_tracking金额列表,如下所示:

| Amount | Carrier |    Date    |
|--------|---------|------------|
|  2599  |   44    | 01/08/2015 |
|  2504  |   44    | 03/08/2015 |
|  4597  |   44    | 04/08/2015 |
|  5058  |   44    | 05/08/2015 |
|  2413  |   44    | 06/08/2015 |
|  4853  |   44    | 07/08/2015 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql group-by

6
推荐指数
1
解决办法
7276
查看次数

SQL Server:行顺序

我们都知道一个简单的语句例如:

SELECT * FROM stuff;
Run Code Online (Sandbox Code Playgroud)

应该不会产生有序的结果。然而,当我试图证明这一点时,它总是以主键顺序出现。

此外还有一个声明,例如:

SELECT thing,whatever FROM stuff
GROUP BY thing,whatever;
Run Code Online (Sandbox Code Playgroud)

似乎总是按GROUP BY子句中的最后一个字段对事物进行排序,这根本没有帮助。

问题是,在什么情况下 SQL SERVER 会在未询问的情况下对结果进行排序,我该怎么做才能阻止这种情况?

我试图向我的学生证明,除非指定,否则顺序是不确定的,但这对我的情况没有帮助。

我承认我正在处理一小组样本数据。

谢谢

sql-server order-by select group-by

5
推荐指数
2
解决办法
445
查看次数

组值:CASE 文本、ELSE 字段值

我有一张ROAD桌子:

+----+------------+
| ID | ROAD_CLASS |
+----+------------+
|  1 | ARTERIAL A |
|  2 | ARTERIAL B |
|  3 | ARTERIAL B |
|  4 | ARTERIAL C |
|  5 | ARTERIAL C |
|  6 | ARTERIAL C |
|  7 | COLLECTOR  |
|  8 | COLLECTOR  |
|  9 | LOCAL      |
| 10 | LOCAL      |
+----+------------+
Run Code Online (Sandbox Code Playgroud)

ROAD_CLASS字段的数据类型是NVARCHAR2.

我想创建一个视图,将所有主干道路分组到一个ARTERIAL类别中,但将其他道路类保留原样:

+------------+
| ROAD_CLASS |
+------------+ …
Run Code Online (Sandbox Code Playgroud)

oracle case group-by oracle-12c

5
推荐指数
1
解决办法
1697
查看次数

使用 ORDER BY 和 LIMIT 对每个组的 n 行求和,其中 LIMIT 是基于另一个表

我需要建立一个梦幻足球游戏用户排行榜。游戏的简化数据库如下:

  • users必须squad_playerssquads每一个matches(由相关transfer_period
  • playersmatch_points每个matches
  • squad_players位置优先。该优先级是如果换人的顺序squad_players不会出现在matches
  • squads具有formations确定从优先级排序的每个位置中选择的最大玩家数量

数据库为MySQL 5.6,最大数量users10K

我能够内部加入(按顺序)squad_players, squads, matches,match_points以获得每个squad_players玩过的人(players没有玩过的人没有match_points)的观点。

我奋力SUM的分X squad_playerssquads其中Xformations通过确定位置的的squad_players

我试图通过具有相关子查询的group by修改 …

mysql database-design group-by mysql-5.6 greatest-n-per-group

5
推荐指数
1
解决办法
800
查看次数

SQL 挑战 - 传感器阈值异常报告

我添加了一个不使用窗口函数的解决方案和一个基准测试,其中包含一个低于 Martin's Answer 的大数据集

这是GROUP BY 使用不在 SELECT 列表中的列的后续线程- 这什么时候实用、优雅或强大?

在我对这一挑战的解决方案中,我使用了一个查询,该查询按不属于选择列表的表达式进行分组。当逻辑分组元素涉及来自其他行的数据时,这经常与窗口函数一起使用。

也许这是一个矫枉过正的例子,但我认为你可能会发现挑战本身很有趣。我会等待发布我的解决方案,也许你们中的一些人可以提出更好的解决方案。

挑战

我们有一个定期记录读数值的传感器表。无法保证采样时间处于单调间隔。

您需要编写一个查询来报告“异常”,这意味着传感器报告的读数超出阈值的次数,无论是低还是高。传感器报告超过或低于阈值的每个时间段都被视为“例外”。一旦读数恢复正常,异常结束。

示例表和数据

该脚本采用 T-SQL 格式,是我的培训材料的一部分。

这是 SQLFiddle 的链接

------------------------------------------
-- Sensor Thresholds - 1 - Setup Example --
------------------------------------------

CREATE TABLE [Sensors]
(
    [Sensor] NVARCHAR(10) NOT NULL,
    [Lower Threshold] DECIMAL(7,2) NOT NULL,
    [Upper Threshold] DECIMAL(7,2) NOT NULL,
    CONSTRAINT [PK Sensors] 
        PRIMARY KEY CLUSTERED ([Sensor]),
    CONSTRAINT [CK Value Range]
        CHECK ([Upper Threshold] > [Lower Threshold])
);
GO

INSERT INTO [Sensors]
( 
    [Sensor] , …
Run Code Online (Sandbox Code Playgroud)

t-sql window-functions group-by

5
推荐指数
2
解决办法
280
查看次数

MySQL:一起使用 DISTINCT 和 GROUP BY?

我看到以下同时使用 DISTINCT 和 GROUP BY 的 MySQL 查询:

SELECT  DISTINCT user_id, post_id, post_content
    FROM  some_table
    GROUP BY  post_id, user_id
    HAVING  post_content LIKE '%abc%';
Run Code Online (Sandbox Code Playgroud)

这是一个与查询一起使用的场景:每个用户都有一个唯一的 id,user_id,并且可以发表多个由唯一 id 标识的帖子post_id。每个帖子都会包含一些文本。

我发现这令人困惑(来自 Oracle DB 之后)并有以下问题:

  1. 使用GROUP BY而不做任何聚合是什么意思?
  2. SELECTvs in中切换列的顺序有什么意义GROUP BY
  3. 从 省略第三列是什么意思GROUP BY
  4. 为什么DISTINCT与 一起使用GROUP BY?在对最终结果或之前完成所有分组之后,是否运行不同的操作?

mysql oracle aggregate group-by distinct

5
推荐指数
2
解决办法
2511
查看次数

如何将一列中的值转置到具有不同列中的值的列中?

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

日期 角色 类型 期间
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;
Run Code Online (Sandbox Code Playgroud)
角色 类型 总分钟数
护士 打扫 45
护士 准备食材 20
志愿者 打扫 15
志愿者 准备食材 43

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

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

postgresql aggregate pivot group-by

5
推荐指数
1
解决办法
2万
查看次数