**Describe the bug**
ClickHouse version: 20.8.2.3
`SELECT DISTINCT b FROM (SELECT a, b FROM d GROUP BY a, b)` may return duplicate result, here is the step to reproduce:

```sql
CREATE TABLE test_local ON CLUSTER xxx (a String, b Int) Engine=TinyLog;
CREATE TABLE test ON CLUSTER xxx (a String, b Int) Engine = Distributed('xxx', 'default', 'test_local', b);
INSERT INTO test VALUES('a', 0), ('a', 1), ('b', 0)
SELECT DISTINCT b FROM (SELECT b FROM test GROUP BY a, b)
```
Expected result:
0
1
Actual result:
0
0
1

**Possible reason:**

`DistinctStep::checkColumnsAlreadyDistinct` return true while `b` exists in its front inputstream's `distinct_columns`(which is `a` and `b` in previous SQL), so `DistinctStep` is skipped in the final execution pipeline. As the comment of  `DataStream::distinct_columns` says: "Tuples with those columns are distinct. It doesn't mean that columns are distinct separately.", `DistinctStep::checkColumnsAlreadyDistinct` may return wrong result.


: ITransformingStep(
        input_stream_,
        Transform::transformHeader(input_stream_.header, std::make_shared<ExpressionActions>(actions_dag_)),
        getTraits(actions_dag_))
    , actions_dag(std::move(actions_dag_))
{
    
    updateDistinctColumns(output_stream->header, output_stream->distinct_columns);
}
void ExpressionStep::updateInputStream(DataStream input_stream, bool keep_header)
{
    Block out_header = keep_header ? std::move(output_stream->header)
                                   : Transform::transformHeader(input_stream.header, std::make_shared<ExpressionActions>(actions_dag));
    output_stream = createOutputStream(
            input_stream,
            std::move(out_header),
            getDataStreamTraits());
    input_streams.clear();
    input_streams.emplace_back(std::move(input_stream));
}
void ExpressionStep::transformPipeline(QueryPipeline & pipeline)