相关疑难解决方法(0)

计算SQL Server中的运行总计

想象一下下表(称为TestTable):

id     somedate    somevalue
--     --------    ---------
45     01/Jan/09   3
23     08/Jan/09   5
12     02/Feb/09   0
77     14/Feb/09   7
39     20/Feb/09   34
33     02/Mar/09   6
Run Code Online (Sandbox Code Playgroud)

我想要一个以日期顺序返回运行总计的查询,例如:

id     somedate    somevalue  runningtotal
--     --------    ---------  ------------
45     01/Jan/09   3          3
23     08/Jan/09   5          8
12     02/Feb/09   0          8
77     14/Feb/09   7          15  
39     20/Feb/09   34         49
33     02/Mar/09   6          55
Run Code Online (Sandbox Code Playgroud)

我知道在SQL Server 2000/2005/2008中有各种方法可以做到这一点.

我对使用aggregate-set-statement技巧的这种方法特别感兴趣:

INSERT INTO @AnotherTbl(id, somedate, somevalue, runningtotal) 
   SELECT id, somedate, somevalue, null
   FROM TestTable
   ORDER …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server running-total

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

如何在SQL Server中的滑动窗口上聚合(计算不同的项目)?

我目前正在使用此查询(在SQL Server中)每天计算唯一项目的数量:

SELECT Date, COUNT(DISTINCT item) 
FROM myTable 
GROUP BY Date 
ORDER BY Date
Run Code Online (Sandbox Code Playgroud)

如何对此进行转换以获取过去3天(包括当天)中每个日期的唯一商品数量

输出应该是一个包含2列的表:一列包含原始表中的所有日期.在第二列,我们有每个日期的唯一项目数.

例如,如果原始表是:

Date        Item  
01/01/2018  A  
01/01/2018  B  
02/01/2018  C  
03/01/2018  C    
04/01/2018  C
Run Code Online (Sandbox Code Playgroud)

根据我上面的查询,我目前获得每天的唯一计数:

Date        count  
01/01/2018  2  
02/01/2018  1  
03/01/2018  1  
04/01/2018  1
Run Code Online (Sandbox Code Playgroud)

我希望得到3天滚动窗口的独特计数:

Date        count  
01/01/2018  2  
02/01/2018  3  (because items ABC on 1st and 2nd Jan)
03/01/2018  3  (because items ABC on 1st,2nd,3rd Jan)    
04/01/2018  1  (because only item C on 2nd,3rd,4th Jan)    
Run Code Online (Sandbox Code Playgroud)

sql sql-server count aggregate-functions sliding-window

11
推荐指数
3
解决办法
1494
查看次数

SQL Server NTILE - 不同四分位数中的相同值

我有一个场景,我使用下面的 SQL Server NTILE 函数将多个结果拆分为四分位数。目标是每个类中的行数相同

case NTILE(4) over (order by t2.TotalStd) 
   when 1 then 'A' when 2 then 'B' when 3 then 'C' else 'D' end as Class
Run Code Online (Sandbox Code Playgroud)

结果表如下所示,A、B、C 和 D 4 个班级组之间有 (9,9,8,8) 拆分。

有两个结果给我带来了问题,两行的总 std 值相同,为 30,但分配给不同的四分位数。

8   30  A
2   30  B
Run Code Online (Sandbox Code Playgroud)

我想知道有没有办法确保将具有相同值的行分配给相同的四分位数?我可以按另一列分组或分区以获得这种行为吗?

Pos TotalStd    class
1   16  A
2   23  A
3   21  A
4   29  A
5   25  A
6   26  A
7   28  A
8   30  A
9   29  A
1   31  B
2 …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008

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

SQL Server 2008中的Count(Distinct([value))OVER(Partition by)

我写了这个并在Oracle中成功执行

COUNT (DISTINCT APEC.COURSE_CODE) OVER (
                                            PARTITION BY s.REGISTRATION_NUMBER
                                            ,APEC.APE_ID
                                            ,COV.ACADEMIC_SESSION
                                            ) APE_COURSES_PER_ACADEMIC_YEAR
Run Code Online (Sandbox Code Playgroud)

我正在尝试在SQL Server中实现相同的结果(我们的源数据库使用Oracle,但我们的仓库使用SQL Server).

我知道SQL Server 2008中的窗口函数不支持distinct - 有人可以提出替代方案吗?

sql sql-server-2008 window-functions

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

通过sql对分区进行不同计数

我有一张像这样的桌子

\n\n
col1ID  col2String Col3ID Col4String Col5Data\n  1        xxx       20      abc     14-09-2018\n  1        xxx       20      xyz     14-09-2018\n  2        xxx       30      abc     14-09-2018\n  2        xxx       30      abc     14-09-2018 \n
Run Code Online (Sandbox Code Playgroud)\n\n

我想添加列来计算 col4String 组中按 col1ID 和 col3ID 有多少个不同的字符串。

\n\n

所以像

\n\n
COUNT(DISTINCT (Col4String)) over (partition by col1ID, col3ID)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但它不起作用,我收到一个错误

\n\n
\n

OVER 子句中不允许使用 DISTINCT。
\n 消息 102,级别 15,状态 1,第 23 行。

\n
\n\n

我有更多列,如 col2String、col5Data 但它们应该 \xc2\xb4t 受到影响,所以我不能在 的开头使用 unique SELECT,并且dense_rank()doen\xc2\xb4t 似乎也适用于我的情况。

\n\n

谢谢你的帮助。

\n

sql t-sql sql-server count distinct

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

如何在 SQL Server 中使用带框架的窗口函数执行 COUNT(DISTINCT)

搭载这个可爱的问题: 分区函数 COUNT() OVER possible using DISTINCT

我希望计算不同值的移动计数。大致如下:

Count(distinct machine_id) over(partition by model order by _timestamp rows between 6 preceding and current row)

显然,SQL Server不支持该语法。不幸的是,我不太了解(没有内部化会更准确)dense_rank 绕行是如何工作的:

dense_rank() over (partition by model order by machine_id) 
+ dense_rank() over (partition by model order by machine_id) 
- 1
Run Code Online (Sandbox Code Playgroud)

因此我无法调整它来满足我对移动窗口的需求。如果我按 machine_id 订购,是否也可以按 _timestamp 订购并使用rows between

sql sql-server count dense-rank window-functions

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