

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# SELECT ALL 和 SELECT DISTINCT
<a name="sql-reference-select-all-distinct"></a>

如果指定了 ALL 关键字，则查询不会消除重复的行。如果既未指定 ALL 也未指定 DISTINCT，则这是默认行为。

如果指定了 DISTINCT 关键字，则查询会根据 SELECT 子句中的列来消除重复的行。

请注意，出于这些目的，值 NULL 被视为等于自身，而不等于任何其他值。这些语义与 GROUP BY 和 IS NOT DISTINCT FROM 运算符的语义相同。
<a name="STREAMINGettingStartedELECTDISTINCT"></a>
**流式 SELECT DISTINCT**  
只要 SELECT 子句中存在非常量单调表达式，SELECT DISTINCT 就可以用于流式查询。（非常量单调表达式的基本原理与流式 GROUP BY 相同。） Amazon Kinesis Data Analytics 在 SELECT DISTINCT 对应的行就绪后将立即生成这些行。

如果 ROWTIME 是 SELECT 子句中的一列，则出于消除重复项的目的，该列将被忽略。在 SELECT 子句中的其他列的基础上消除重复项。

例如：

```
SELECT STREAM DISTINCT ROWTIME, prodId, FLOOR(Orders.ROWTIME TO DAY)
FROM Orders
```

显示在任何给定日期订购的独特产品的集合。

如果您正在进行“GROUP BY floor(ROWTIME TO MINUTE)”，并且在给定的一分钟内有两行，例如 22:49:10 和 22:49:15，那么这些行的摘要就会出现，时间戳为 22:50:00。为什么？ 因为这是该行完成的最早时间。

**注意：**“GROUP BY ceil(ROWTIME TO MINUTE)”或“GROUP BY floor(ROWTIME TO MINUTE) - INTERVAL '1' DAY”将提供相同的行为。

决定行完成的不是分组表达式的值，而是该表达式的值何时发生变化。

如果您希望输出行的行时间是其生成时间，那么在下面的示例中，您需要从表单 1 改为使用表单 2：

```
(Form 1)
   select distinct floor(s.rowtime to hour), a,b,c
   from s
(Form 2)
   select min(s.rowtime) as rowtime, floor(s.rowtime to hour), a, b, c
   from s
   group by floor(s.rowtime to hour), a, b, c
```