标签: ansi-sql

如何使用ANSI SQL为简单的数据仓库编写这两个查询?

我正在编写一个简单的数据仓库,它允许我查询表以观察数据的周期性(比如每周)变化,以及数据变化的变化(例如每周销售额的每周变化).

为了简单起见,我将介绍我在这里使用的表的非常简化(几乎无关紧要)的版本.销售数据表是一个视图,具有以下结构:

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)

哪个分区的日期为报告范围.

我需要编写允许我执行以下操作的查询:

  1. 在指定时间段内返回sales_amt 更改.例如,今天销售与销售N天之间的变化 - 其中N是正整数(在这种情况下N == 7).

  2. 返回指定期间sales_amt 变化的变化.对于(1).我们计算了一周的变化.现在我们想知道这种变化与上周计算的(周和周)变化有何不同.

然而,我在这一点上陷入困​​境,因为SQL是我最弱的技能.如果SQL主管可以解释如何以DB不可知的方式编写这些查询(即使用ANSI SQL),我将不胜感激.

sql data-warehouse ansi-sql

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

Oracle 10g是否符合ANSI SQL-1992子字符串功能标准?

根据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标准子字符串函数而不是特定于供应商的函数.

sql oracle ansi-sql ansi-sql-92

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

在两个EXCEPT子句查询中使用ORDER BY

我希望在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。

sql ansi-sql

3
推荐指数
2
解决办法
5430
查看次数

BigQuery标准SQL:如何返回数组的第一个值?

小例子

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选择数组的第一个值?

sql ansi-sql google-bigquery

3
推荐指数
2
解决办法
4084
查看次数

使用ansi 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'的字符串?

oracle formatting derby ansi-sql

2
推荐指数
1
解决办法
1636
查看次数

在ANSI SQL的CREATE TABLE语句中创建默认的命名列

我想在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”附近的语法不正确。

sql ansi-sql

2
推荐指数
1
解决办法
2227
查看次数

只是好奇SQL连接

我只是好奇.如果我有两张桌子,那就说客户和订单.客户端具有唯一的主键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应该知道哪些列与两个表相关...

sql-server ansi-sql

2
推荐指数
1
解决办法
100
查看次数

在BigQuery中,如何随机拆分查询结果?

在 BigQuery(标准 SQL)中,我想从查询中随机分割结果行。

  • 分割需要保持一致,并且不应随时间变化:这意味着每次运行查询时,分割都应保持不变。

  • 特别是,如果将数据添加到源表,则先前位于拆分一侧的数据应保留在同一拆分中。

  • 该策略应该能够处理不同的分割比率

例如,我目前有一个表mytable,其中包含列(order_id、、)created_atcountry

一方面,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)

但这会产生不一致的分裂。有没有办法正确实现这一目标?

sql random ansi-sql google-bigquery

2
推荐指数
1
解决办法
2610
查看次数

bigquery中比较两个表的有效方法

我有兴趣比较两个表是否包含相同的数据。

我可以这样做:

#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)

但是,当我想比较所有数字列时,这有点困难,尤其是当我想对多个表组合进行比较时。

因此,我的问题是:是否有人意识到有可能遍历所有数字列并将结果集限制为那些差异不为零的键?

sql ansi-sql google-bigquery bigquery-standard-sql

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

如何在 Snowflake SELECT 中展平一组 ARRAY_AGGS

我正在尝试对多个连接的 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)

arrays ansi-sql snowflake-cloud-data-platform

2
推荐指数
1
解决办法
1098
查看次数