我一直在寻找很长时间但却找不到任何有趣的答案。
这是我的问题,让我们说我有一个包含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请求,但我正在寻找一次性请求。谢谢你的回答。
答案 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