背景:
在最初的情况下是非常简单的.计算从最高收入到最低收入的每位用户的总运行总数:
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)
输出:
??????????????????????????????????????????????????????????
? ID ? User ? Revenue ? percentage ? running_percentage ?
??????????????????????????????????????????????????????????
? 2 ? James ? 750 ? 0.38 ? …Run Code Online (Sandbox Code Playgroud) 这一直困扰着我 - 为什么SQL语句中的GROUP BY子句要求我包含所有非聚合列?默认情况下应该包含这些列 - 一种"GROUP BY*" - 因为我甚至无法运行查询,除非它们全部包含在内.每列必须是聚合或在"GROUP BY"中指定,但似乎任何未聚合的列都应自动分组.
也许它是ANSI-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
我已观察ANY并SOME至少得到这些SQL DBMS的支持:
我可以安全地假设所有这些方言(以及其他方言)都作为同义词处理ANY,SOME或者在任何/某些DBMS中两个关键字之间是否存在细微差别?
我在SQL92定义中找到了这个:
<quantifier> ::= <all> | <some>
<all> ::= ALL
<some> ::= SOME | ANY
Run Code Online (Sandbox Code Playgroud)
这并没有说出ANY和的语义SOME.稍后在文档中,仅<some>引用,而不是两个关键字.我怀疑在NULL处理方面可能存在细微差别,例如,至少在一些DBMS中.任何/某些指向明确声明的指针是否可以被假定是值得欢迎的.
我很好奇,想知道各种SQL标准的,即一些更多的细节SQL-92,SQL:99,SQL:2003,SQL:2008等有一个短期和有用的概述维基百科,链接到非常昂贵的文件.为什么这些文件不向公众开放?我能找到一些公开免费的信息吗?
请不要发布您在Google上找到的链接.我只对某些权威文档感兴趣.
我很好奇我是否可以依赖任何特定的验证NOT NULL, FOREIGN KEY, UNIQUE, CHECK约束和BEFORE触发器的顺序.
根据经验,我知道MySQL首先检查NOT NULL,然后启动BEFORE触发器,然后检查UNIQUE约束.Oracle NOT NULL在BEFORE触发后检查(我相信SQLServer也会这样做,但不记得).标准是否对订单有所说明,或者完全取决于数据库供应商?
在我的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来解决.真正重要的部分是获得子串.
我有以下脚本,并希望对其进行更改,以使其符合国际标准.我使用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语法相同的概念对我有用。这是错误吗?这是一个例子。
(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>`
<time1> 是绝对的,是自Unix时代以来创建表的时间(以毫秒为单位)。<time2> 是当前时间戳(以毫秒为单位) 正如Mikhail指出的,此功能不适用于Standard 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) 我的表有两列,id和a.列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"]组合在一起,和我失去了我的数组的"真实"价值(所以如果我想在另一个查询后使用它,我必须分割字符串).
此字段数组中的值来自用户,因此我不能假设某些字符永远不会存在(并将其用作分隔符).
在写了几年SQL之后,我发现经常把我感兴趣的列放入其中SELECT然后再次指定它们很烦人GROUP BY.我不禁想,我们为什么要那样做?
用户必须具体说明要分组的列的原因是什么?我们不能让SQL引擎假设是否存在聚合函数SELECT,其余的非聚合列分组?
当你有一个大的,这将是特别有帮助,更简洁CASE WHEN在SELECT.
我正在尝试运行以下查询以选择 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-standards ×12
sql ×9
ansi-sql ×2
group-by ×2
postgresql ×2
sql-server ×2
string ×2
aggregate ×1
any ×1
arrays ×1
database ×1
oracle ×1
standards ×1
string-split ×1
subquery ×1
t-sql ×1