首页 > 解决方案 > SQL Group BY COLUMN 选择特定行

问题描述

我一直在寻找很长时间,但找不到任何有趣的答案。

这是我的问题,假设我有一个包含 2 列和多行的表:

column1  |   column2
         |
BKZ-54   |   N/A
BKZ-54   |   OPVE7
BKZ-54   |   OXP5V
ARF-47   |   RB5FR 
ARF-47   |   N/A
ARF-47   |   V7FTS 

SQL 请求后的预期响应:

column1  |   column2
BKZ-54   |   OPVE7
ARF-47   |   RB5FR

问题是,如果我使用GROUP BY column1,将选择 column2 的随机值,我想排除那些使用N/A.

如果我使用GROUP BY column1 and WHERE column2 != 'N/A',则响应中不存在行。

我希望 SQL 请求按 column1 分组,并在 column2 中获得一个对应的随机值,但不同于'N/A'.

我看到的唯一方法是发出 2 个 SQL 请求,但我正在寻找一次性请求。感谢您的回答。

标签: sql

解决方案


SQL Server 示例。您消除了“N/A”,但真正的诀窍是获得每个 Column1 值的前 1 行。我通过生成由 Column1 分区的行号然后只接受其中 Row=1 来实现这一点。NEWID() 将导致它们被随机排序。单独运行内部 SELECT 语句,以便您可以看到它在做什么。

DECLARE @table TABLE (column1 VARCHAR(200),column2 VARCHAR(200))
INSERT INTO @Table SELECT 'BKZ-54','N/A'
INSERT INTO @Table SELECT 'BKZ-54','OPVE7'
INSERT INTO @Table SELECT 'BKZ-54','OXP5V'
INSERT INTO @Table SELECT 'ARF-47','RB5FR'
INSERT INTO @Table SELECT 'ARF-47','N/A'
INSERT INTO @Table SELECT 'ARF-47','V7FTS'

SELECT
    Column1,Column2
FROM (
    SELECT
        *,
        ROW_NUMBER() OVER (PARTITION BY Column1 ORDER BY NEWID() ASC) AS [Row]
    FROM @table
    WHERE column2<>'N/A'
) AS OrderedData
WHERE OrderedData.[Row]=1

推荐阅读