- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题:是根据id顺序从表中找到最后一个非NULL值,在这里找到http://sqlmag.com/t-sql/last-non-null-puzzle
CREATE TABLE Score(`id` int, `col1` INT NULL);
INSERT INTO Score
(`id`, `col1`)
VALUES
(2, NULL),
(3, 10),
(5, -1),
(7, NULL),
(11, NULL),
(13, -12),
(17, NULL),
(19, NULL),
(23, 1759);
期望的输出:
id col1 lastval
----------- ----------- -----------
2 NULL NULL
3 10 10
5 -1 -1
7 NULL -1
11 NULL -1
13 -12 -12
17 NULL -12
19 NULL -12
23 1759 1759
我在 SQLFiddle MySQL 5.6 中的代码
SELECT s1.id, COALESCE(s2.col1)
FROM score s1 JOIN score s2
ON s1.id >= s2.id
GROUP BY s1.id
ORDER BY s1.id, s2.id DESC
据我所知,COALESCE 给出了列表中遇到的第一个非 NULL 值。但它为所有列提供 (null)
。你能指出为什么 COALESCE
不起作用吗?我还意识到删除 COALESCE
也应该回答这个问题,因为 GROUP BY
子句返回 s2.col1
列中的第一个值。我在这里可能是错的。
最佳答案
COALESCE() 返回其参数列表中的第一个非空值。没有将 COALESCE() 应用于分组行集上的相同表达式的隐式行为。它不是像 SUM() 或 GROUP_CONCAT() 这样的聚合函数。
将它与一个参数一起使用是没有意义的,因为您只给了它一个参数。因此,这与将 s2.col1
放入查询的选择列表中而不将其放入 COALESCE() 调用中完全相同。
然后,当在 GROUP BY 函数中引用非分组列时,MySQL 将保留默认行为:MySQL 从组中的某行中任意选择 s2.col1
的值。实际上,这是按索引顺序读取的组中的第一行,但您不应依赖于此。
因此,在您的示例中,您的连接将每一行 s1
连接到所有行 s2
,以便 s2.id
更早。每个组都包含表中的第一行,其中 s2.id=2
。该行的 col1 为 NULL。
我通读了您试图解决的 SQL 难题。在 MySQL 中会特别尴尬,因为 MySQL 不支持窗口函数。
这些情况下的解决方案通常涉及使用 MySQL User-Defined Variables当您的查询遍历表中的行时,该值会发生变化。这可能非常棘手。
以下是我如何以可移植的方式解决问题(没有 MySQL 用户变量):
SELECT s1.id, s1.col1, s2.col1 as lastval
FROM Score AS s1
LEFT OUTER JOIN Score AS s2 ON s2.id <= s1.id AND s2.col1 IS NOT NULL
LEFT OUTER JOIN Score AS s3 ON s3.id > s2.id AND s3.id <= s1.id AND s3.col1 IS NOT NULL
WHERE s3.id IS NULL
ORDER BY s1.id;
下面是如何使用 MySQL 用户变量解决它:
SELECT id, col1, @lastval := COALESCE(col1, @lastval) AS lastval
FROM (SELECT @lastval := NULL) AS _init
CROSS JOIN Score
ORDER BY id;
我会避免使用您在下方评论中发布的查询,因为它使用了相关子查询。相关子查询通常不利于性能。
关于mysql - SELECT 子句中的 COALESCE 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41089036/
我正在尝试返回有关所执行搜索次数的每小时报告。我的结果不包括搜索为零的时间,我认为我的语法正确,可以使用 COALESCE。谁能看到我做错了什么?谢谢 SELECT CAST(startdatetim
众所周知,COALESCE 是一个 ANSI SQL 标准函数。它在不同的 RDBMS 中具有相同的功能(即)它返回值列表中的第一个 NOT NULL 值。 考虑以下数据设置 CREATE TABLE
## 问题## 我从这个脚本中收到错误(Postgresql 9.3.2) (在 MS SQL Server 中没问题) SELECT CASE COALESCE(my_date_field,0)
只是想看看是否有人有更好的方法来完成我所需要的。 先来个背景。我的数据库中有一个表,目前大约有 20,000 行。在表中,我们有一列用于 FirstName 和 LastName。还有一列是 Refe
我在 SO 中找不到它,并且认为在这里找到它可能是值得的,因为 oracle 文档没有指定它。 http://docs.oracle.com/cd/B28359_01/server.111/b2828
我刚刚了解了 COALESCE,我想知道是否可以在两个表之间合并整行数据?如果没有,以下散漫的最佳方法是什么? 例如,我有这两个表并假设所有列都匹配: tbl_员工 Id Name E
为什么此查询在某些情况下会产生重复项? Table_1 ID 1 2 3 Table_2 ID 1 2 4 Table_3 ID 1 3 4 询问: SELECT C
我有一张名为 table1 的表带列Gender varchar(10)和 Team numeric . create table table1 ( ID integer Gender varchar
SQL Server 2005 中是否有一个函数,如果任何参数(任何类型)为 NULL,它会返回 NULL [或 bool 值],这样我就不用编写 IF a 为 NULL 或 b 为 NULL 或 c
来自this question , a neat answer about using COALESCE简化复杂的逻辑树。我考虑了短路的问题。 例如,在大多数语言的函数中,参数都会被完全求值,然后传递
// lItems is TDataSet or TClientDataSet with lItems do begin Close; Filtered := false; Fi
我有一个包含季度值的表,我需要添加一个新列,为我提供上个季度的最后一个非空值。例如 ID | Project | Q1 | Q2 | Q3 | Q4 | Current Quarte
大家好,Stackoverflowers!我有一个正在处理的查询,我需要过滤掉 0,但它没有删除那些记录,我似乎无法弄清楚原因。 请看下面, SELECT disb_sum, pl_balance,
我是 mysql 触发器的新手。只是让我的头脑思考一些事情,以便我了解某些内容是否可能未正确编码或最有效的路线:) 我想做的是在添加数据库条目后通过提交的值连接表以创建用于全文搜索的文本字符串,因为我
我是 REDSHIFT 中 COALESCE 功能的新手。我在 mysql 和 Redshift 中运行了以下四个查询。 第一个和第二个查询在 mysql 和 redshift 中均按预期执行。但对于
首先,我想澄清一下,我已经阅读过 this问题。那里描述的问题与我的问题非常相似,但与一个错误有关,该错误已经解决。 通过在 Windows 上运行的 MySQL WorkBench 5.2.47 C
我有这两张表: users(这有一个 updated_at 列)和 user_updates(这有一个用户的外键 user_id 和一个 created_at 列) 我想为用户找到最新的用户更新,所以
我正在使用 Postgres 并有以下 SQL 语句: SELECT * FROM "osmlocal-dsd-de".t_osm_vehicle_image t WHERE t.vehicle_co
如果我有一个简单的查询 SELECT row FROM table WHERE id=my_id 如果找不到 my_id,我想要一行 NULL 而不是空行,我可以使用 coalesce COALESC
我有一个使用 COALESCE(timestamp_type::date,charachter_varying) 的查询,由于数据类型不匹配而失败: 错误:无法匹配 COALESCE 类型的日期和字符
我是一名优秀的程序员,十分优秀!