[英]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
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.