2016-01-06 64 views
0

比方说,我有一个表名表A与下面的部分数据:SELECT DISTINCT不工作

LOOKUP_VALUE  LOOKUPS_CODE  LOOKUPS_ID 
------------  ------------  ---------- 
      5%    120   1001 
      5%    121   1002 
      5%    123   1003 
      2%    130   2001 
      2%    131   2002 

我想只选择行2%的1 5%和1行作为使用DISTINCT一个视图但它失败了,我的查询是:

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

什么是您选择的表格定义? –

+0

没有'where'子句就不可能?你为什么不想用一个? –

+0

您的查询应该已经获取5行和2行中的1行。 – Vampiro

回答

3

这是我在你的问题的猜测 - 当你说

“上述查询给我的结果如图所示在数据表的上方。”

这根本不是真的 - 请尝试它并相应地更新您的问题。

我在这里推测:我认为你正在尝试使用“独特”,但也输出其他领域。如果你运行:

select distinct Field1, Field2, Field3 ... 

那么你的输出将是3场的“每个不同的组合一行”。

尝试GROUP BY代替 - 这会让你选择最大值,最小值,其他领域的总和,同时还产生“每个独特组合值一列”的字段包含在GROUP BY

下面的示例使用您的表返回每Lookup_Array中一行,然后将余下的字段的最大值和最小值,并使用你的数据总记录的计数:

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 
5

我想你误解的DISTINCT范围:它会给你不同的,不只是在第一个fi独特场。

如果你想为每个不同的LOOKUP_VALUE一行,您可能需要一个WHERE条款,将制定出它们中的哪一个来展示,或聚集战略,在这告诉查询如何将SELECT一个GROUP BY条款加逻辑汇总其他列(例如,AVGMAXMIN

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 
0

MIN()函数如何?

我相信这适用于您所需的输出,但目前无法对其进行测试。

SELECT Lookup_Value, MIN(LOOKUPS_CODE) 
FROM TableA 
GROUP BY Lookup_Value; 
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