Sql 如何将此语句限制为仅区分第一列“COMPANY_NAME”,而不区分其他列

Sql 如何将此语句限制为仅区分第一列“COMPANY_NAME”,而不区分其他列,sql,distinct,Sql,Distinct,我需要这段代码来返回上面的列,其中公司名称不会重复 您使用的是什么数据库管理系统 如果您使用postgres 8.4 forward,您可以执行以下操作: select DISTINCT(COMPANY_NAME) , COMPANY_CODE, CONTACT_NAME , PHONE_NUMBER FROM COMPANIES WHERE HAS_INVENTORY = 'T' AND STATUS = 'ON' AND CONTACT_NAME <> ' ' AND

我需要这段代码来返回上面的列,其中公司名称不会重复

您使用的是什么数据库管理系统

如果您使用postgres 8.4 forward,您可以执行以下操作:

select DISTINCT(COMPANY_NAME) , COMPANY_CODE, CONTACT_NAME , PHONE_NUMBER 
FROM COMPANIES 
WHERE HAS_INVENTORY = 'T' 
AND STATUS = 'ON' 
AND CONTACT_NAME <> ' ' 
AND PHONE_NUMBER NOT LIKE '%N/A%' 
AND EMAIL_ADDRESS NOT LIKE '%@SOME_EMAIL.COM' 
ORDER BY COMPANY_NAME ASC
在mssql上,您需要执行子查询,然后过滤外部结果,如下所示:

select distinct on (company_name)
    *
from table ....
有点脏,但这是我以前解决这个问题的唯一方法


如果您希望公司名称和联系人名称都有不同的记录,则只需在行编号函数的分区部分下添加两列即可。

distinct始终考虑整个记录,而不是单个列。你能给出一些你想要实现的输出的例子吗?我想他在问如何忽略输出中特定字段上的重复值query@lrb当前位置如果你必须猜测被问到的问题,那么问题就不清楚了。很抱歉,这是我的第一篇帖子,Irb是对的,我试图忽略特定字段COMPANY_NAME上的重复值。您是要输出NULL值还是重复COMPANY_NAME值,类似于创建带分组的报告?还有,毫无疑问,为什么?您的数据库是否允许同一表中同一公司的多个联系人?这与获取聚合在公司名称上的组的第一个值相同。如果出于任何原因,一个公司的名称有多个不同的联系人名称,那么您如何知道应该使用哪一个?这就是order by子句使用row_number函数生效的地方。它将按顺序排列,并将根据order by从1、2、3等开始枚举行。order by用于partition by Clausehower中指定的列中的每个不同值,如果您选择where row_id=1,那么当相同的公司名称与不同的联系人名称再次出现时,您将得到row_id=2,但由于您的where子句,您将永远看不到该联系人。我不是说您不正确,我可能误解了这个问题。您的回答将按自然顺序返回与同一公司的第一次联系。似乎问题中的每一个联系人都在寻找。哦,我明白了。那么,一个将由公司组成一个小组,然后将其他的小组放入一个阵列中。在postgres中,使用array_agg函数很容易做到这一点,然后在函数之外将array_放入_string[array],','。但我不确定这里使用的数据库管理系统。或者您可以在partition by子句中输入公司名称和联系人名称。然后它会在这两个列上给出不同的行。我更新了答案。
select *
from 
from (
    select COMPANY_NAME, COMPANY_CODE, CONTACT_NAME,PHONE_NUMBER 
       , row_number() over(partition by company_name order by /* however you want to order it */) row_id
    FROM COMPANIES 
    WHERE HAS_INVENTORY = 'T' 
    AND STATUS = 'ON' 
    AND CONTACT_NAME <> ' ' 
    AND PHONE_NUMBER NOT LIKE '%N/A%' 
    AND EMAIL_ADDRESS NOT LIKE '%@SOME_EMAIL.COM' 
    ORDER BY COMPANY_NAME ASC
    ) x
where row_id = 1