我在 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) 我有这样结构的表:
+-------+------------------+
| 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) 在GROUP BY和HAVING与隐藏列,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 对结果进行排序,从而可能选择一个意外的值。
还有哪些极端情况可以打破这种行为?或者它对于生产系统是否足够可靠?
我有以下查询:
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) 我们都知道一个简单的语句例如:
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 会在未询问的情况下对结果进行排序,我该怎么做才能阻止这种情况?
我试图向我的学生证明,除非指定,否则顺序是不确定的,但这对我的情况没有帮助。
我承认我正在处理一小组样本数据。
谢谢
我有一张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) 我需要建立一个梦幻足球游戏用户排行榜。游戏的简化数据库如下:
users必须squad_players在squads每一个matches(由相关transfer_period)players有match_points每个matchessquad_players有位置,优先。该优先级是如果换人的顺序squad_players不会出现在matches squads具有formations确定从优先级排序的每个位置中选择的最大玩家数量数据库为MySQL 5.6,最大数量users为10K。
我能够内部加入(按顺序)squad_players, squads, matches,match_points以获得每个squad_players玩过的人(players没有玩过的人没有match_points)的观点。
我奋力SUM的分X squad_players每squads其中X是formations通过确定位置的的squad_players。
我试图通过具有相关子查询的group by修改 …
mysql database-design group-by mysql-5.6 greatest-n-per-group
我添加了一个不使用窗口函数的解决方案和一个基准测试,其中包含一个低于 Martin's Answer 的大数据集
这是GROUP BY 使用不在 SELECT 列表中的列的后续线程- 这什么时候实用、优雅或强大?
在我对这一挑战的解决方案中,我使用了一个查询,该查询按不属于选择列表的表达式进行分组。当逻辑分组元素涉及来自其他行的数据时,这经常与窗口函数一起使用。
也许这是一个矫枉过正的例子,但我认为你可能会发现挑战本身很有趣。我会等待发布我的解决方案,也许你们中的一些人可以提出更好的解决方案。
我们有一个定期记录读数值的传感器表。无法保证采样时间处于单调间隔。
您需要编写一个查询来报告“异常”,这意味着传感器报告的读数超出阈值的次数,无论是低还是高。传感器报告超过或低于阈值的每个时间段都被视为“例外”。一旦读数恢复正常,异常结束。
该脚本采用 T-SQL 格式,是我的培训材料的一部分。
------------------------------------------
-- 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) 我看到以下同时使用 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 之后)并有以下问题:
GROUP BY而不做任何聚合是什么意思?SELECTvs in中切换列的顺序有什么意义GROUP BY?GROUP BY?DISTINCT与 一起使用GROUP BY?在对最终结果或之前完成所有分组之后,是否运行不同的操作?我有一个具有以下结构的数据库:
| 日期 | 角色 | 类型 | 期间 |
|---|---|---|---|
| 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。
group-by ×10
aggregate ×3
mysql ×3
oracle ×3
sql-server ×3
t-sql ×3
case ×1
distinct ×1
mysql-5.6 ×1
oracle-12c ×1
order-by ×1
pivot ×1
postgresql ×1
select ×1