不使用DISTINCT,如何在不改变值的情况下对数据进行分组?

时间:2016-04-05 19:34:05

标签: sql sql-server-2008 tsql

我觉得这是一个愚蠢的问题,只有一个简单的答案,但是这里有。

如何在不使用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

5 个答案:

答案 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)

  1. 你应该有更好的理由不使用编程功能而不是“我只是不喜欢它”
  2. 您可以拥有使用其他CTE的CTE
  3. @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>