我正在编写一个简单的数据仓库,它允许我查询表以观察数据的周期性(比如每周)变化,以及数据变化的变化(例如每周销售额的每周变化).
为了简单起见,我将介绍我在这里使用的表的非常简化(几乎无关紧要)的版本.销售数据表是一个视图,具有以下结构:
CREATE TABLE sales_data (
sales_time date NOT NULL,
sales_amt double NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
出于这个问题的目的.我遗漏了你期望看到的其他字段 - 比如product_id,sales_person_id等等,因为它们与这个问题没有直接关系.AFAICT,将在查询中使用的唯一字段是sales_time和sales_amt字段(除非我弄错了).
我还有一个日期维度表,其结构如下:
CREATE TABLE date_dimension (
id integer NOT NULL,
datestamp date NOT NULL,
day_part integer NOT NULL,
week_part integer NOT NULL,
month_part integer NOT NULL,
qtr_part integer NOT NULL,
year_part integer NOT NULL,
);
Run Code Online (Sandbox Code Playgroud)
哪个分区的日期为报告范围.
我需要编写允许我执行以下操作的查询:
在指定时间段内返回sales_amt 周的更改.例如,今天销售与销售N天之间的变化 - 其中N是正整数(在这种情况下N == 7).
返回指定期间sales_amt 变化的变化.对于(1).我们计算了一周的变化.现在我们想知道这种变化与上周计算的(周和周)变化有何不同.
然而,我在这一点上陷入困境,因为SQL是我最弱的技能.如果SQL主管可以解释如何以DB不可知的方式编写这些查询(即使用ANSI SQL),我将不胜感激.
根据ANSI SQL-1992标准,第132页,这是ANSI子字符串函数的语法:
<character substring function> ::=
SUBSTRING <left paren> <character value expression> FROM <start position>
FOR <string length> ] <right paren>
Run Code Online (Sandbox Code Playgroud)
SQL开发人员在oracle 10g架构上的快速测试:
SELECT SUBSTRING('ASDF' FROM 1 FOR 1) FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
结果是:
ORA-00907: missing right parenthesis
00907. 00000 - "missing right parenthesis"
*Cause:
*Action:
Error at Line: 1 Column: 28
Run Code Online (Sandbox Code Playgroud)
这是否意味着Oracle 10g不符合此特定ANSI标准?
我只想使用ANSI标准子字符串函数而不是特定于供应商的函数.
我希望在ANSI SQL中实现分页查询。
我在SQL Server中尝试了以下查询,但不允许这样做:
select top 20 * from MyTable order by id
except
select top 10 * from MyTable order by id
Run Code Online (Sandbox Code Playgroud)
但是以下工作正常:
select top 20 * from MyTable
except
select top 10 * from MyTable order by id
Run Code Online (Sandbox Code Playgroud)
例如:
input expected result
20 11
11 13
25 14
6 16
4 17
2 18
1 19
9 20
3 25
7
8
16
17
18
13
14
19
10
5
Run Code Online (Sandbox Code Playgroud)
从上面的示例可以看出,如果我们不能编写第一个ORDER BY子句,那么结果将不会具有值20、11、25。
小例子
SELECT SPLIT("hello::hej::hallo::hoi", "::")
Run Code Online (Sandbox Code Playgroud)
返回一个数组[hello, hej, hallo, hoi],我要在其中选择第一个元素hello。BG Standard没有提供FIRST,相反FIRST_VALUE(..) OVER(),我无法在上面的示例中使用它,因此
如何使用BigQuery Standard SQL选择数组的第一个值?
我正在为我的项目Oracle和Apache Derby使用两个不同的数据库,并且尽可能地尝试使用两个数据库支持的ANSI SQL语法.
我有一个带有列的表 amount_paid NUMERIC(26,2).
我使用Oracle数据库的旧代码需要以此格式检索值
SELECT LTRIM(TO_CHAR(amount_paid,'9,999,999,999,999.99'))
Run Code Online (Sandbox Code Playgroud)
如何使用ANSI sql语法将数值转换为格式为'9,999,999,999,999.99'的字符串?
我想在CREATE TABLE语句中以符合ANSI的方式创建命名默认值
如果我尝试像往常那样在ALTER TABLE语句中添加CONSTRAINT,它将失败(至少在SQL SERVER中,尽管我强调我希望找到ANSI投诉语句,因为我希望它能在多种情况下使用Ado.NET DbConnections)。
例:
CREATE TABLE [dbo].[MyExample]
(
Id int NOT NULL IDENTITY (1, 1),
Name varchar(512) NOT NULL,
IsActive bit NOT NULL,
CONSTRAINT PK_MyExample PRIMARY KEY CLUSTERED (Id),
CONSTRAINT DF_MyExample_IsActive DEFAULT (1) FOR [IsActive]
)
Run Code Online (Sandbox Code Playgroud)
错误:
“ for”附近的语法不正确。
我只是好奇.如果我有两张桌子,那就说客户和订单.客户端具有唯一的主键ID_Client.订单还有一个ID_Client字段,以及通过ID_Client字段维护客户表的完整性的关系.
所以,当我想加入两个表时,我会:
SELECT
Orders.*, Clients.Name
FROM
Orders
INNER JOIN
Clients ON Clients.ID_Client = Orders.ID_Client
Run Code Online (Sandbox Code Playgroud)
因此,如果我接受了创建主键的工作,以及表之间的关系,
我有必要在on子句中明确包含连接列吗?
为什么我不能这样做:
SELECT
Orders.*, Clients.Name
FROM
Orders
INNER JOIN
Clients
Run Code Online (Sandbox Code Playgroud)
所以SQL应该知道哪些列与两个表相关...
在 BigQuery(标准 SQL)中,我想从查询中随机分割结果行。
分割需要保持一致,并且不应随时间变化:这意味着每次运行查询时,分割都应保持不变。
特别是,如果将数据添加到源表,则先前位于拆分一侧的数据应保留在同一拆分中。
该策略应该能够处理不同的分割比率
例如,我目前有一个表mytable,其中包含列(order_id、、)created_at:country
一方面,10%/90% 的分配
SELECT
*
FROM
`mytable`
WHERE RAND() <= 10/90
Run Code Online (Sandbox Code Playgroud)
另一方面
SELECT
*
FROM
`mytable`
WHERE RAND() > 10/90
Run Code Online (Sandbox Code Playgroud)
但这会产生不一致的分裂。有没有办法正确实现这一目标?
我有兴趣比较两个表是否包含相同的数据。
我可以这样做:
#standardSQL
SELECT
key1, key2
FROM
(
SELECT
table1.key1,
table1.key2,
table1.column1 - table2.column1 as col1,
table1.col2 - table2.col2 as col2
FROM
`table1` AS table1
LEFT JOIN
`table2` AS table2
ON
table1.key1 = table2.key1
AND
table1.key2 = table2.key2
)
WHERE
col1 != 0
OR
col2 != 0
Run Code Online (Sandbox Code Playgroud)
但是,当我想比较所有数字列时,这有点困难,尤其是当我想对多个表组合进行比较时。
因此,我的问题是:是否有人意识到有可能遍历所有数字列并将结果集限制为那些差异不为零的键?
我正在尝试对多个连接的 VARIANT 列表进行 SELECT。主记录作为 DATA 返回,它周围的所有支持信息都由作为 INCLUDED 返回的支持连接表组成。
我在支持的 VARIANT 记录和 ARRAY_AGG(DISTINCT [record]) 上使用 ARRAY_CONSTRUCT_COMPACT 来聚合它们并消除重复。
问题是 ARRAY_AGG 在我的一个连接表 (ENTITIES) 上生成了多个记录。当它们使用 ARRAY_CONSTRUCT_COMPACT() 构造时,结果是一个数组数组,我需要将其展平为单个对象数组。
我尝试将 ARRAY_COMPACT 和 ARRAY_CAT 与嵌套的 ARRAY_AGGS 结合使用,但需要注意的是 ARRAY_CAT 只接受 2 个参数。下面的代码让我最接近我需要的东西,但我似乎无法弄清楚如何将最终数组展平为包含。
SELECT
a1.appointment data,
ARRAY_CONSTRUCT_COMPACT(
ARRAY_AGG(DISTINCT c1.call),
ARRAY_AGG(DISTINCT e1.entity),
ARRAY_AGG(DISTINCT a2.address)
) included
FROM APPOINTMENTS a1
INNER JOIN CALLS c1 ON c1.call:id = a1.appointment:callId
INNER JOIN ENTITIES e1 ON e1.entity:id IN (
a1.appointment:relationships.agent,
a1.appointment:relationships.consultant,
a1.appointment:relationships.contact
)
INNER JOIN ADDRESSES a2 ON a2.address:id = a1.appointment:relationships:office
WHERE a1.appointment:id = …Run Code Online (Sandbox Code Playgroud) ansi-sql ×10
sql ×7
oracle ×2
ansi-sql-92 ×1
arrays ×1
derby ×1
formatting ×1
random ×1
snowflake-cloud-data-platform ×1
sql-server ×1