我觉得这是一个愚蠢的问题,只有一个简单的答案,但是这里有。
如何在不使用DISTINCT
的情况下对以下数据进行分组? @Table
有5行,显示5-9小时的数据。我只是不喜欢DISTINCT
。
由于我需要将当天的所有小时数显示为Hr9(包括0-4),我将其与表DimTime
一起加入。 DimTime
有所有时间,但间隔为15分钟。所以,DimTime
看起来像这样:
Hour Minute
0 0
0 15
0 30
0 45
1 0
1 15
1 30
1 45
所以这是我的剧本:
declare @table table
(
Hour int,
Value int
)
insert into @table select 5, 25
insert into @table select 6, 34
insert into @table select 7, 54
insert into @table select 8, 65
insert into @table select 9, 11
select d.hour, t.hour, sum(value)
from @table t
left join dimtime d on d.hour = t.hour
group by d.hour, t.hour
如果我使用GROUP BY
,那么我需要有一个聚合函数。因此,如果我使用SUM
,它会将所有值乘以4.如果我删除聚合函数,我将收到语法错误。
另外,我不能使用CTE
,因为@table中的内容来自CTE
(我之前没有包含它)。
以下是我需要显示的结果:
Hour Value
0 null
1 null
2 null
3 null
4 null
5 25
6 34
7 54
8 65
9 11
答案 0 :(得分:1)
只需添加一个条件WHERE minute = 0
,每小时只返回一行。
答案 1 :(得分:1)
如果您真的要使用dimtime
子句跳过distinct
上的排序操作,请检查以下说明。
显示dimtime
的所有小时数(0-9),并将value
中给出的@table
与特定小时相加:
SELECT
d.hour, SUM(t.value)
FROM
dimtime d
LEFT JOIN @table t
ON d.hour = t.hour
WHERE d.minute = 0 -- retrieves one row for every hour from dimtime
GROUP BY d.hour
ORDER BY d.hour -- not needed, but will give you resultset sorted by hour
假设您的minute = 0
中每小时都有一行值为dimtable
的行,您可以限制为连接操作检索的行数。这适用于列表0, 15, 30, 45
中的任何值。
SUM()
可以通过汇总hour
中给定@table
的所有值来正常工作。如果没有特定小时的行,则会返回0
值。
答案 2 :(得分:0)
@dnoeth提供了一个很好的答案,但这是另一种选择:
2.1.6
答案 3 :(得分:0)
尝试
SELECT *
FROM DimTime D
LEFT JOIN myTable T
ON D.Hour = T.Hour
WHERE D.Minute = 0
<强> SQL Fiddle Demo 强>
<强>输出强>
| Hour | Minute | Hour | Value |
|------|--------|--------|--------|
| 0 | 0 | (null) | (null) |
| 1 | 0 | (null) | (null) |
| 2 | 0 | (null) | (null) |
| 3 | 0 | (null) | (null) |
| 4 | 0 | (null) | (null) |
| 5 | 0 | 5 | 25 |
| 6 | 0 | 6 | 34 |
| 7 | 0 | 7 | 54 |
| 8 | 0 | 8 | 65 |
| 9 | 0 | 9 | 11 |
答案 4 :(得分:-1)
如果我使用GROUP BY,那么我需要有一个聚合函数
仅当您在SELECT
中包含不属于您的组密钥的表达式时才会这样做。你当然可以做到
select d.hour, t.hour, value
from @table t
inner join dimtime d
on d.hour = t.hour
group by d.hour, t.hour, value
或
select d.hour, t.hour, MIN(value)
from @table t
inner join dimtime d
on d.hour = t.hour
group by d.hour, t.hour
请注意,第一个查询会为您提供与DISTINCT
完全相同的结果(甚至可能会编译到同一个查询计划中),所以我不确定您对DISTINCT
的反感是什么。< / p>