SQL Group BY COLUMN选择特定行

时间:2018-04-25 13:48:41

标签: sql

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

这是我的问题,让我们说我有一个包含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请求,但我正在寻找一次性请求。谢谢你的回答。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我不确定你是否想要一个真正的“随机”值,或者是否有任何值可以做到并且无关紧要。如果是后者,则使用类似MAX()的聚合来选择值:

SELECT column1, MAX(column2)
FROM yourTable
WHERE column2 <> 'N/A'
GROUP BY column1