标签: sql-standards

SQL Server - 具有相关性的条件聚合

背景:

最初的情况下是非常简单的.计算从最高收入到最低收入的每位用户的总运行总数:

CREATE TABLE t(Customer INTEGER  NOT NULL PRIMARY KEY 
              ,"User"   VARCHAR(5) NOT NULL
              ,Revenue  INTEGER  NOT NULL);

INSERT INTO t(Customer,"User",Revenue) VALUES
(001,'James',500),(002,'James',750),(003,'James',450),
(004,'Sarah',100),(005,'Sarah',500),(006,'Sarah',150),
(007,'Sarah',600),(008,'James',150),(009,'James',100);
Run Code Online (Sandbox Code Playgroud)

查询:

SELECT *,
    1.0 * Revenue/SUM(Revenue) OVER(PARTITION BY "User") AS percentage,
    1.0 * SUM(Revenue) OVER(PARTITION BY "User" ORDER BY Revenue DESC)
         /SUM(Revenue) OVER(PARTITION BY "User") AS running_percentage
FROM t;
Run Code Online (Sandbox Code Playgroud)

LiveDemo

输出:

??????????????????????????????????????????????????????????
? ID ? User  ? Revenue ? percentage ? running_percentage ?
??????????????????????????????????????????????????????????
?  2 ? James ?     750 ? 0.38       ? …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server postgresql sql-standards

17
推荐指数
1
解决办法
415
查看次数

为什么我需要在SQL"GROUP BY"子句中显式指定所有列 - 为什么不"GROUP BY*"?

这一直困扰着我 - 为什么SQL语句中的GROUP BY子句要求我包含所有非聚合列?默认情况下应该包含这些列 - 一种"GROUP BY*" - 因为我甚至无法运行查询,除非它们全部包含在内.每列必须是聚合或在"GROUP BY"中指定,但似乎任何未聚合的列都应自动分组.

也许它是ANSI-SQL标准的一部分,但即便如此,我也不明白为什么.有人可以帮我理解这个约定的必要性吗?

sql group-by aggregate ansi-sql sql-standards

12
推荐指数
1
解决办法
6676
查看次数

SQL ANY和SOME关键字在所有SQL方言中都是同义词吗?

在Postgres中,ANY并且SOME在谓词表达式的右侧使用时是同义词.例如,这些是相同的:

column = ANY (SELECT ...)
column = SOME (SELECT ...)
Run Code Online (Sandbox Code Playgroud)

这在此处记录:

http://www.postgresql.org/docs/9.1/static/functions-subquery.html#FUNCTIONS-SUBQUERY-ANY-SOME

我已观察ANYSOME至少得到这些SQL DBMS的支持:

  • DB2
  • 德比
  • H2
  • HSQLDB
  • 安格尔
  • MySQL的
  • 神谕
  • Postgres的
  • SQL Server
  • Sybase ASE
  • Sybase SQL Anywhere

我可以安全地假设所有这些方言(以及其他方言)都作为同义词处理ANY,SOME或者在任何/某些DBMS中两个关键字之间是否存在细微差别?

我在SQL92定义中找到了这个:

<quantifier> ::= <all> | <some>
<all> ::= ALL
<some> ::= SOME | ANY
Run Code Online (Sandbox Code Playgroud)

这并没有说出ANY和的语义SOME.稍后在文档中,仅<some>引用,而不是两个关键字.我怀疑在NULL处理方面可能存在细微差别,例如,至少在一些DBMS中.任何/某些指向明确声明的指针是否可以被假定是值得欢迎的.

sql subquery any sql-standards

11
推荐指数
1
解决办法
3205
查看次数

权威的SQL标准文档

我很好奇,想知道各种SQL标准的,即一些更多的细节SQL-92,SQL:99,SQL:2003,SQL:2008等有一个短期和有用的概述维基百科,链接到非常昂贵的文件.为什么这些文件不向公众开放?我能找到一些公开免费的信息吗?

请不要发布您在Google上找到的链接.我只对某些权威文档感兴趣.

sql sql-standards

10
推荐指数
2
解决办法
2691
查看次数

SQL标准是否指定约束验证的顺序并触发触发?

我很好奇我是否可以依赖任何特定的验证NOT NULL, FOREIGN KEY, UNIQUE, CHECK约束和BEFORE触发器的顺序.

根据经验,我知道MySQL首先检查NOT NULL,然后启动BEFORE触发器,然后检查UNIQUE约束.Oracle NOT NULLBEFORE触发后检查(我相信SQLServer也会这样做,但不记得).标准是否对订单有所说明,或者完全取决于数据库供应商?

sql sql-standards

8
推荐指数
1
解决办法
1175
查看次数

在特定字符SQL-Standard处拆分字符串

在我的SQL语句中,我必须从字符'_'处的字符串中提取子字符串.字符串可以是例如'A_XXX''AB_XXX''ABC_XXXX',因此提取的子字符串应该像'A''AB''ABC'.

在Oracle中,使用substr()和instr()函数很容易:

select substr('AB_XXX', 1, instr('AB_XXX', '_')-1) as substring
from dual;
Run Code Online (Sandbox Code Playgroud)

结果将是:

SUBSTRING
------------------------
AB
Run Code Online (Sandbox Code Playgroud)

我需要此查询来检查特定子字符串是否在字符串数组中.

整个查询看起来像:

select 'AB_XXX' from dual
where (instr('ABC_AB_A', substr('AB_XXX', 1, instr('AB_XXX', '_')-1))>0);
Run Code Online (Sandbox Code Playgroud)

有没有办法在SQL-Standard中编写它?

在此先感谢您的帮助.

编辑:

如果PostgreSQL提供了另一种功能,它也会有所帮助.其余的可以用例如IN来解决.真正重要的部分是获得子串.

string postgresql string-split sql-standards

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

将SQL标准应用于脚本

我有以下脚本,并希望对其进行更改,以使其符合国际标准.我使用SQL-Server,但只要有可能,我想遵循SQL的国际标准.我不相信方括号是标准的 - 我应该用双引号替换它们吗?

如果没有付费获得标准文档的副本,那么互联网上是否有任何资源可以提供按照标准要求格式化和布局的脚本示例?

SELECT 
    a.UserAccountKey,
    SUM(ISNULL(b.[measure Y],0.0)) AS "measure Y",
    SUM(ISNULL(c.[measure Z],0.0)) AS "measure Z"
FROM 
    XXX a
    LEFT OUTER JOIN YYYY b ON
        a.UserAccountKey = b.UserAccountKey
    LEFT OUTER JOIN ZZZZ c ON
        a.UserAccountKey = c.UserAccountKey
GROUP BY
    a.UserAccountKey
Run Code Online (Sandbox Code Playgroud)

编辑

我唯一不喜欢的经典标准是以下几点.这是由AaronBertrand提出的,我同意它更具可读性 - 特别是如果该SELECT条款有20或30个字段:

SELECT 
    a.UserAccountKey,
    "measure Y"             = SUM(ISNULL(b."measure Y",0.0)),
    "measure Z"             = SUM(ISNULL(c."measure Z",0.0)),
    "measure longertitle"   = SUM(ISNULL(c."measure longertitle",0.0)),
    "me short"              = SUM(ISNULL(c."me short",0.0))
FROM 
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-standards

7
推荐指数
1
解决办法
242
查看次数

具有标准SQL的BigQuery表装饰器

我在使用标准SQL的表装饰器时遇到了一些麻烦。但是,与旧版SQL语法相同的概念对我有用。这是错误吗?这是一个例子。

(A)以下查询有效,没有任何问题

SELECT COUNT(*) FROM [some-project-name:some_dataset.some_table_name@<time1>-<time2>]

(B)以下查询返回错误消息 Error: Table "some-project-name.some_dataset.some_table_name@<time1>-<time2>" cannot include decorator

SELECT COUNT(*) FROM `some-project-name.some_dataset.some_table_name@<time1>-<time2>`

笔记:

  • 查询(A)的“使用旧版SQL”框已选中
  • 查询(B)的“使用旧版SQL”框未选中
  • <time1> 是绝对的,是自Unix时代以来创建表的时间(以毫秒为单位)。
  • <time2> 是当前时间戳(以毫秒为单位)

更新:

正如Mikhail指出的,此功能不适用于Standard SQL。在这里已被要求。

sql-standards google-bigquery

4
推荐指数
2
解决办法
2798
查看次数

COALESCE或CASE更高效和/或标准

在x方面与y相比.

  • x更符合sql标准吗?[主观道歉]
  • x比y更有效吗?
  • 或者这些脚本完全不同并且可以在不同的上下文中使用?

X

    SELECT * 
    FROM   a 
           INNER JOIN b ON
           COALESCE(b.columntojoin, b.alternatecolumn) = a.columntojoin
Run Code Online (Sandbox Code Playgroud)

ÿ

    SELECT * 
    FROM   a 
           INNER JOIN b ON
           (case when b.columntojoin is null then b.alternatecolumn else b.columntojoin end) = a.columntojoin
Run Code Online (Sandbox Code Playgroud)

sql standards sql-standards

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

BigQuery标准SQL:如何按ARRAY字段分组

我的表有两列,ida.列id包含一个数字,列a包含一个字符串数组.我想计算给定数组的唯一ID数,数组之间的相等性定义为"相同大小,每个索引的字符串相同".

使用时GROUP BY a,我明白了Grouping by expressions of type ARRAY is not allowed.我可以使用类似的GROUP BY ARRAY_TO_STRING(a, ","),但随后的两个数组["a,b"],并["a","b"]组合在一起,和我失去了我的数组的"真实"价值(所以如果我想在另一个查询后使用它,我必须分割字符串).

此字段数组中的值来自用户,因此我不能假设某些字符永远不会存在(并将其用作分隔符).

arrays string group-by sql-standards google-bigquery

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

是否真的有必要在SQL标准中使用GROUP BY

在写了几年SQL之后,我发现经常把我感兴趣的列放入其中SELECT然后再次指定它们很烦人GROUP BY.我不禁想,我们为什么要那样做?

用户必须具体说明要分组的列的原因是什么?我们不能让SQL引擎假设是否存在聚合函数SELECT,其余的非聚合列分组

当你有一个大的,这将是特别有帮助,更简洁CASE WHENSELECT.

sql ansi-sql sql-standards

0
推荐指数
1
解决办法
305
查看次数

在 2 个日期之间选择值时得到不正确的结果

我正在尝试运行以下查询以选择 2 个日期之间的一些结果,但由于条件不存在,我得到了结果。那么这里有什么问题呢?

select OPEN_TIME, STATUS 
from PROBSUMMARY 
where trunc (open_time) >= '01-01-2020' 
  and trunc (open_time) < '01-01-2021'
Run Code Online (Sandbox Code Playgroud)

sql database oracle sql-standards

0
推荐指数
1
解决办法
47
查看次数