假设我有一个表名TableA,其中包含以下部分数据:
LOOKUP_VALUE LOOKUPS_CODE LOOKUPS_ID
------------ ------------ ----------
5% 120 1001
5% 121 1002
5% 123 1003
2% 130 2001
2% 131 2002
我想使用DISTINCT只选择1行5%和1行2%作为视图,但它失败了,我的查询是:
SELECT DISTINCT lookup_value, lookups_code
FROM TableA;
以上查询给出了如下所示的结果。
LOOKUP_VALUE LOOKUPS_CODE
------------ ------------
5% 120
5% 121
5% 123
2% 130
2% 131
但这不是我预期的结果,mt预期结果如下所示:
LOOKUP_VALUE LOOKUPS_CODE
------------ ------------
5% 120
2% 130
我可以知道如何在不指定任何WHERE子句的情况下实现此目的吗? 谢谢!
答案 0 :(得分:5)
我认为你误解了DISTINCT
的范围:它会给你不同的行,而不仅仅是第一个字段的不同。
如果您想为每个不同的LOOKUP_VALUE
添加一行,您需要一个WHERE
子句来确定要显示哪一个,或者需要一个带有GROUP BY
子句的聚合策略加上SELECT
中的逻辑,告诉查询如何汇总其他列(例如AVG
,MAX
,MIN
)
答案 1 :(得分:3)
这是我对你的问题的猜测 - 当你说
时"上面的查询给出了上面数据表中显示的结果。"
这是不正确的 - 请尝试并相应地更新您的问题。
我在这里猜测:我认为你正在尝试使用" Distinct"而且还输出其他字段。如果您运行:
select distinct Field1, Field2, Field3 ...
然后你的输出将是"每个不同的组合一行"三个领域。
尝试使用GROUP BY - 这将允许您选择其他字段的最大值,最小值,总和,同时仍然产生"每个唯一组合值一行#34;对于GROUP BY中包含的字段
下面的示例使用您的表为每个LOOKUP_VALUE返回一行,然后使用您的数据返回剩余字段的最大值和最小值以及总记录数:
select
LOOKUP_VALUE, min( LOOKUPS_CODE) LOOKUPS_CODE_min, max( LOOKUPS_CODE) LOOKUPS_CODE_max, min( LOOKUPS_ID) LOOKUPS_ID_min, max( LOOKUPS_ID) LOOKUPS_ID_max, Count(*) Record_Count
From TableA
Group by LOOKUP_VALUE
答案 2 :(得分:1)
我想只选择1行5%和1行2%
这将获得每个lookups_code
的最低值lookup_value
:
SELECT lookup_value,
lookups_code
FROM (
SELECT lookup_value,
lookups_code,
ROW_NUMBER() OVER ( PARTITION BY lookup_value ORDER BY lookups_code ) AS rn
FROM TableA
)
WHERE rn = 1
您也可以使用GROUP BY
:
SELECT lookup_value,
MIN( lookups_code ) AS lookups_code
FROM TableA
GROUP BY lookup_value
答案 3 :(得分:0)
MIN()函数怎么样
我相信这适用于您想要的输出,但我目前无法测试它。
SELECT Lookup_Value, MIN(LOOKUPS_CODE)
FROM TableA
GROUP BY Lookup_Value;
答案 4 :(得分:0)
我将在黑暗中完全拍摄,但由于你命名字段的方式,它暗示你试图模仿Microsoft Excel中的vlookup
功能。如果是这种情况,则存在多个匹配时的行为是选择第一个匹配。听起来是随意的,它是它的工作方式。
如果这是您想要的,并且第一个值不一定是最低值(或最高,或最佳,或其他),那么row_number聚合函数可能会满足您的需求。
我告诉你一个警告,我的订购标准是基于数据库行号,这可能与你的想法不同。但是,如果您将它们插入干净的桌子(带有重置高水位标记),那么我认为这是一个非常安全的选择,它会按照您想要的方式运行。如果没有,那么最好明确地包括一个字段,告诉它你希望选择发生的顺序。
with cte as (
select
vlookup_value,
vlookups_code,
row_number() over (partition by vlookup_value order by rownum) as rn
from
TableA
)
select
vlookup_value, vlookups_code
from cte
where rn = 1