简体   繁体   English

选择一列DISTINCT SQL

[英]Select one column DISTINCT SQL

Added: Working with SQL Server 2000 and 2005, so has to work on both. 补充:使用SQL Server 2000和2005,因此必须同时使用它们。 Also, value_rk is not a number/integer (Error: Operand data type uniqueidentifier is invalid for min operator) 另外,value_rk不是数字/整数(错误:操作数数据类型uniqueidentifier对于min运算符无效)

Is there a way to do a single column "DISTINCT" match when I don't care about the other columns returned? 当我不关心返回的其他列时,有没有办法做单列“DISTINCT”匹配? Example: 例:

**Table**
Value A, Value L, Value P
Value A, Value Q, Value Z

I need to return only one of these rows based on what is in the first one (Value A). 我需要根据第一行(值A)中的内容返回其中一行。 I still need results from the second and third columns (the second should actually match all across the board anyway, but the third is a unique key, which I need at least one of). 我仍然需要来自第二和第三列的结果(第二列实际上应该全部匹配,但第三列是唯一的键,我至少需要其中一个)。

Here's what I've got so far, although it doesn't work obviously: 这是我到目前为止所得到的,尽管它显然不起作用:

SELECT value, attribute_definition_id, value_rk
FROM attribute_values
WHERE value IN (
    SELECT value, max(value_rk)
    FROM attribute_values
)
ORDER BY attribute_definition_id

I'm working in ColdFusion so if there's a simple workaround in that I'm open to that as well. 我在ColdFusion工作,所以如果有一个简单的解决方法,我也会对此持开放态度。 I'm trying to limit or "group by" the first column "value". 我试图限制或“分组”第一列“值”。 value_rk is my big problem since every value is unique but I only need one. value_rk是我的大问题,因为每个值都是唯一的,但我只需要一个。

NOTE: value_rk is not a number, hence this DOES NOT WORK 注意:value_rk不是数字,因此这不起作用

UPDATE: I've got a working version, it's probably quite a bit slower than a pure SQL version, but honestly anything working at this point is better than nothing. 更新:我有一个工作版本,它可能比纯SQL版本慢一点,但老实说,在这一点上工作的东西总比没有好。 It takes the results from the first query, does a second query except limiting it's results to one, and grabs a matching value_rk for the value that matches. 它从第一个查询获取结果,执行第二个查询,但将结果限制为一个,并获取匹配值的匹配value_rk。 Like so: 像这样:

<cfquery name="queryBaseValues" datasource="XXX" timeout="999">
    SELECT DISTINCT value, attribute_definition_id
    FROM attribute_values
    ORDER BY attribute_definition_id
</cfquery>

<cfoutput query="queryBaseValues">
    <cfquery name="queryRKValue" datasource="XXX">
        SELECT TOP 1 value_rk
        FROM attribute_values
        WHERE value = '#queryBaseValues.value#'
    </cfquery>
    <cfset resourceKey = queryRKValue.value_rk>
    ...

So there you have it, selecting a single column distinctly in ColdFusion. 所以你有它,在ColdFusion中明显选择一个列。 Any pure SQL Server 2000/2005 suggestions are still very welcome :) 任何纯SQL Server 2000/2005建议仍然非常受欢迎:)

this might work: 这可能有效:

SELECT DISTINCT a.value, a.attribute_definition_id, 
  (SELECT TOP 1 value_rk FROM attribute_values WHERE value = a.value) as value_rk
FROM attribute_values as a
ORDER BY attribute_definition_id

.. not tested. ..未经测试。

SELECT a1.value, a1.attribute_definition_id, a1.value_rk
FROM attribute_values AS a1
  LEFT OUTER JOIN attribute_values AS a2
    ON (a1.value = a2.value AND a1.value_rk < a2.value_rk)
WHERE a2.value IS NULL
ORDER BY a1.attribute_definition_id;

In other words, find the row a1 for which no row a2 exists with the same value and a greater value_rk . 换句话说,找到没有行a2的行a1具有相同的value和更大的value_rk

This should work for PostgreSQL, i don't know which dbms you use. 这应该适用于PostgreSQL,我不知道你使用哪个dbms。

SELECT DISTINCT ON (value)
  value, 
  attribute_definition_id, 
  value_rk
FROM 
  attribute_values
ORDER BY
  value, 
  attribute_definition_id

PostgreSQL Docs PostgreSQL文档

Is this what you're looking for? 这是你在找什么?

SELECT value, attribute_definition_id, value_rk
FROM attribute_values av1
WHERE value_rk IN (
        SELECT max(value_rk)
        FROM attribute_values av2
        WHERE av2.value = av1.value
)
ORDER BY attribute_definition_id

If value_rk is unique, this should work. 如果value_rk是唯一的,那么这应该有效。

Okay, here's my assumptions: 好的,这是我的假设:

Standard SQL Server 标准SQL Server

value_rk is not a numeric value, but value and attribute_definition_id are numeric. value_rk不是数值,但value和attribute_definition_id 数字。

SELECT value_rk, MIN(value) as value, MIN(attribute_definition_id) as attribute_definition_id
FROM attribute_values
GROUP BY value_rk
ORDER BY MIN(attribute_definition_id)

If one of those fields isn't numeric, then it'll require more thought - please let us know. 如果其中一个字段不是数字,则需要更多考虑 - 请告诉我们。

If you are open to using table variables, you could keep it all within a single database call like this: 如果您愿意使用表变量,则可以将它保存在单个数据库调用中,如下所示:

DECLARE @attribute_values TABLE (value int, attribute_definition_id int, value_rk uniqueidentifier)

INSERT INTO @attribute_values (value)
SELECT DISTINCT value FROM attribute_values

UPDATE @attribute_values
SET attribute_definition_id = av2.attribute_definition_id,
    value_rk = av2.value_rk
FROM @attribute_values av1
INNER JOIN attribute_values av2 ON av1.value = av2.value

SELECT value, attribute_definition_id, value_rk FROM @attribute_values

Essentially you are creating a limited recordset with the table filled with unique values of 'value', and letting SQL Server fill in the gaps using just one of the matches from the main table. 基本上,您正在创建一个有限的记录集,其中表填充了“value”的唯一值,并让SQL Server仅使用主表中的一个匹配来填补空白。

Edited to add: This syntax works within cfquery just fine. 编辑添加:这个语法在cfquery中运行得很好。

SELECT value, attribute_definition_id, value_rk
FROM attribute_values
WHERE value, value_rk IN (
        SELECT value, max(value_rk)
        FROM attribute_values
        GROUP BY value
)
ORDER BY attribute_definition_id

NOT TESTED! 没有测试!

I'm not sure if I entirely understand your set-up, but would something like this work: 我不确定我是否完全理解你的设置,但是会像这样工作:

SELECT value, attribute_definition_id, value_rk
FROM attribute_values
GROUP BY value
ORDER BY attribute_definition_id;

Again, I'm not real sure which column it is you're trying to limit, or how you're wanting to limit it. 同样,我不确定你要限制哪个列,或者你想如何限制它。

As noted by John Fiala, the canonical answer in SQL server is to use a group by clause when you want to perform a "distinct" operation over a subset of columns. 正如John Fiala所指出的,SQL服务器中的规范答案是当您想要对列的子集执行“不同”操作时使用group by子句。 Why is this the correct canonical answer? 为什么这是正确的规范答案? Well, you want to pull in columns that are not part of your "distinct" group. 好吧,你想要引入不属于“不同”组的列。 Exactly what rows do you want to pull in for these subsidiary columns? 对于这些辅助列,您想要引入哪些行? Using a group by clause and defining aggregate functions for these subsidiary columns makes your query well-behaved in the sense that you now know how these subsidiary columns are obtained. 使用group by子句并为这些子列定义聚合函数可以使您的查询在您现在知道如何获取这些子列的意义上表现良好。 This article gives more details: 本文提供了更多详细信息:

http://weblogs.sqlteam.com/jeffs/archive/2007/10/12/sql-distinct-group-by.aspx http://weblogs.sqlteam.com/jeffs/archive/2007/10/12/sql-distinct-group-by.aspx

SELECT value_rk, MIN(value) as value, 
MIN(attribute_definition_id) as attribute_definition_id
FROM attribute_values
GROUP BY value_rk

Also, it's worth noting that MIN and MAX work on text and several other data types that are not numeric values. 此外,值得注意的是MIN和MAX处理文本和其他几种非数值的数据类型。

Less elegant than I would like---- it's essentially what you're doing, just in pure SQL--- but it works and can all be done in SQL. 不如我想要的那么优雅----它本质上就是你在做什么,只是在纯SQL中 - 但是它可以工作,并且都可以在SQL中完成。

DECLARE @mytable TABLE(mykey NVARCHAR(512), myVal NVARCHAR(512))

DECLARE @keyVal NVARCHAR(512)
DECLARE @depVal NVARCHAR(512)
DECLARE myCursor CURSOR for
   SELECT DISTINCT(value) FROM attribute_values
OPEN myCursor
FETCH NEXT FROM myCursor INTO @keyVal
WHILE @@FETCH_STATUS=0
  BEGIN
     SET @depVal = (SELECT TOP 1 attribute_definition_id FROM attribute_values WHERE VALUE=@keyVal ORDER BY attribute_definition_id)
     INSERT INTO @mytable (mykey, myVal) VALUES (@keyVal, @depVal)
     FETCH NEXT FROM myCursor INTO @keyVal
  END
DEALLOCATE myCursor

SELECT * FROM @mytable

You can add a depVal2 and others using this method. 您可以使用此方法添加depVal2和其他人。

i think 我认为

SELECT DISTINCT a.value, a.attribute_definition_id, 
(SELECT TOP 1 value_rk FROM attribute_values WHERE value = a.value) as value_rk
FROM attribute_values as a
ORDER BY attribute_definition_id

worked 工作

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM