我在 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 对结果进行排序,从而可能选择一个意外的值。
还有哪些极端情况可以打破这种行为?或者它对于生产系统是否足够可靠?
我有一个具有以下结构的表:
CREATE TABLE `Rings` (
ID_RingType CHAR(2),
Number MEDIUMINT UNSIGNED,
ID_User INT(11)
);
Run Code Online (Sandbox Code Playgroud)
和数据:
INSERT INTO `Rings` VALUES
('AA',1,1),
('AA',2,1),
('AA',3,1),
('AA',11,1),
('AA',12,1),
('AA',13,1),
('AA',14,1),
('AA',15,1),
('AB',16,1),
('AB',17,1),
('AB',18,1),
('AB',19,1),
('AB',20,2),
('AB',21,2),
('AB',22,2);
Run Code Online (Sandbox Code Playgroud)
我想组基于所述数据ID_User和ID_RingType和用于数字的每个连续范围列出MIN和MAX。
结果应如下所示:
ID_User | ID_RingType | MIN | MAX
1 | 'AA' | 1 | 3
1 | 'AA' | 11 | 15
1 | 'AB' | 16 | 19
2 | 'AB' | 20 | 22
Run Code Online (Sandbox Code Playgroud)
我浏览了关于这个主题的几篇文章,但无法调整它们以适合我的数据。
任何帮助,将不胜感激。
我有以下查询:
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) 我在 Postgres 9.4.1 中有两个表,events并event_refs具有以下模式:
events 桌子
CREATE TABLE events (
id serial NOT NULL PRIMARY KEY,
event_type text NOT NULL,
event_path jsonb,
event_data jsonb,
created_at timestamp with time zone NOT NULL
);
-- Index on type and created time
CREATE INDEX events_event_type_created_at_idx
ON events (event_type, created_at);
Run Code Online (Sandbox Code Playgroud)
event_refs 桌子
CREATE TABLE event_refs (
event_id integer NOT NULL,
reference_key text NOT NULL,
reference_value text NOT NULL,
CONSTRAINT event_refs_pkey PRIMARY KEY (event_id, reference_key, reference_value),
CONSTRAINT event_refs_event_id_fkey FOREIGN KEY (event_id) …Run Code Online (Sandbox Code Playgroud) postgresql performance execution-plan group-by postgresql-9.4 postgresql-performance
我发现 MySQL 在ONLY_FULL_GROUP_BY启用模式时似乎有问题,并且查询包含 a HAVING,它指的是来自不同表的具有相同名称的分组列。
这是复制问题的架构:
CREATE TABLE t1 (c1 INT, c2 INT);
CREATE TABLE t2 (c1 INT, c2 INT);
Run Code Online (Sandbox Code Playgroud)
您需要添加ONLY_FULL_GROUP_BY到您的 SQL 模式:
SET SESSION SQL_MODE='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY'
Run Code Online (Sandbox Code Playgroud)
这是创建错误的查询:
SELECT t1.c1, t2.c1
FROM t1, t2
GROUP BY t1.c1, t2.c1
HAVING t1.c1 > 1 AND t2.c1 > 1;
Run Code Online (Sandbox Code Playgroud)
错误内容:
HAVING 子句中使用了非分组字段“c1”
双方t1.c1并t2.c1进行分组,所以我看不出有什么不对这个查询。
此外,如果查询引用同一个表中的不同列名,则查询有效。例如:
SELECT t1.c1, t2.c2
FROM t1, t2
GROUP BY t1.c1, t2.c2
HAVING t1.c1 > 1 AND t2.c2 > 1;
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?我在任何地方都找不到有关此问题的报告。我可以在 Ubuntu 上的 …
我有下表(在 SQL Fiddle 上查看)(我创建是为了解决我的问题):
| ID | word |
----------------
| 5 | "Hello" |
| 6 | NULL |
| 7 | "World" |
| 8 | "World" |
Run Code Online (Sandbox Code Playgroud)
现在我想使用GROUP BY word WITH ROLLUP. ROLLUP 生成的行的列 word 中的 NULL 应替换为“total”:
SELECT
ID,
ifnull(word, "total") as word,
count(*) as occurrences
FROM test
GROUP BY word WITH ROLLUP;
Run Code Online (Sandbox Code Playgroud)
问题是它还会用NULL单词为 NULL 的行数替换记录中的 :
| ID | word | occurrences |
|----|-------|-------------|
| 6 | total | …Run Code Online (Sandbox Code Playgroud) 从 MySQL 5.5 升级到 MySQL 5.7 后,我的一些查询出现错误:
错误 1055 (42000):
SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列“grocery.Product_Category.category_id”,该列在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容
我做了我的研究并找到了问题的原因以及如何解决它,基本上我只需要从@@sql_mode 中删除 ONLY_FULL_GROUP_BY ,一切都会再次工作。
但是,我想知道这是否是正确的做法。有没有替代方法,也许是构建查询的更好方法?
这是我的情况(http://sqlfiddle.com/#!9/6f1bd):
我有两个表(我在这里简化了它们的结构,但基本相同):产品和类别以及一个多对多关系表,以允许产品属于多个类别:
SELECT * FROM Product;
+------------+---------+
| product_id | name |
+------------+---------+
| 1 | Tomato |
| 2 | Orange |
| 3 | Banana |
| 4 | Lettuce |
| 5 | Carrot |
+------------+---------+
5 rows in set (0,00 sec)
SELECT * FROM Category;
+-------------+------------+
| …Run Code Online (Sandbox Code Playgroud) 我很想知道如何创建一个视图,以 10 分钟最接近 10 分钟的间隔分组时间戳,并包含每个最小和最大时间戳。
所以一个看起来像这样的表:
| Hero | timestamp |
| Batman | 2016-12-08 12:00:00 |
| Batman | 2016-12-08 12:07:00 |
| Batman | 2016-12-08 13:00:00 |
| Batman | 2016-12-08 14:00:00 |
| Wonder Woman | 2016-12-08 10:15:00 |
| Wonder Woman | 2016-12-08 10:18:00 |
| Wonder Woman | 2016-12-08 10:25:00 |
| Wonder Woman | 2016-12-08 10:30:00 |
Run Code Online (Sandbox Code Playgroud)
会导致这样的观点
| Hero | start_time | end_time |
| Batman | 2016-12-08 12:00:00 | 2016-12-08 12:07:00 | …Run Code Online (Sandbox Code Playgroud) postgresql group-by gaps-and-islands datetime postgresql-9.5
group-by ×10
mysql ×5
mysql-5.5 ×2
postgresql ×2
sql-server ×2
t-sql ×2
aggregate ×1
datetime ×1
mysql-5.6 ×1
mysql-5.7 ×1
null ×1
oracle ×1
performance ×1