Wählen Sie eine Spalte DISTINCT SQL
-
05-07-2019 - |
Frage
Hinzugefügt: Arbeiten mit SQL Server 2000 und 2005, so hat sowohl zu arbeiten. Auch value_rk ist keine Zahl / integer (Error: Operand Datentyp unique ist ungültig für min Operator)
Gibt es eine Möglichkeit, eine einzelne Spalte „distinct“ Spiel zu tun, wenn ich über die anderen Spalten zurückgegeben nicht kümmern? Beispiel:
**Table**
Value A, Value L, Value P
Value A, Value Q, Value Z
Ich brauche nur eine dieser Zeilen zurückgeben auf dem, was in dem ersten (Wert A). Ich brauche noch Ergebnisse aus den zweiten und dritten Spalte (die zweite sollte eigentlich sowieso alle auf der ganzen Linie übereinstimmen, aber der dritte ist ein eindeutiger Schlüssel, die ich mindestens eine der benötigen).
Hier ist, was ich bisher habe, obwohl es nicht offensichtlich funktioniert:
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
Ich bin offen für das auch Ich arbeite in Coldfusion so, wenn es, dass eine einfache Abhilfe ist. Ich versuche, „Gruppe“ der ersten Spalte „Wert“ zu begrenzen oder zu. value_rk ist mein großes Problem dar, da jeder Wert eindeutig ist, aber ich brauche nur einen.
Hinweis: value_rk ist keine Zahl, damit dies nicht funktioniert
UPDATE: Ich habe eine funktionierende Version bekommt, ist es wahrscheinlich ziemlich viel langsamer als eine reine SQL-Version, aber ehrlich gesagt etwas an diesem Punkt arbeitet, ist besser als nichts. Es nimmt die Ergebnisse der ersten Abfrage, hat eine zweite Abfrage, außer es die Ergebnisse zu eins, und packt eine passende value_rk für den Wert begrenzt, die übereinstimmt. Wie 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 haben Sie es, eine einzelne Spalte deutlich in Coldfusion auswählen. Irgendwelche reinen SQL Server 2000/2005 Vorschläge sind immer noch sehr willkommen:)
Lösung
Dies könnte funktionieren:
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
.. nicht getestet.
Andere Tipps
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;
Mit anderen Worten, finden Sie die Zeile a1
, für die keine Zeile a2
mit derselben value
existiert und eine größere value_rk
.
Dies sollte für PostgreSQL arbeiten, ich weiß nicht, welche dbms Sie verwenden.
SELECT DISTINCT ON (value)
value,
attribute_definition_id,
value_rk
FROM
attribute_values
ORDER BY
value,
attribute_definition_id
Ist das, was Sie suchen?
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
Wenn value_rk eindeutig zuzuordnen sind, sollte diese Arbeit.
Okay, hier sind meine Annahmen:
Standard SQL Server
value_rk ist kein numerischer Wert, sondern Wert und attribute_definition_id ist numerisch.
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)
Wenn eines dieser Felder nicht numerisch ist, dann wird es mehr Gedanken erfordern -. Bitte lassen Sie uns wissen
Wenn Sie Tabellenvariablen zu verwenden geöffnet sind, können Sie es halten alle in einer einzigen Datenbank-Aufruf wie folgt aus:
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
Verwendung nur eines der Spiele aus der Haupttabelle Im Wesentlichen erstellen Sie einen begrenzte-Cord mit der Tabelle mit eindeutigen Werten von ‚Wert‘ gefüllt und lassen SQL Server in den Lücken füllen.
Edited hinzufügen. Diese Syntax innerhalb cfquery funktioniert gut
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
NICHT GETESTET!
Ich bin mir nicht sicher, ob ich völlig Ihr Set-up zu verstehen, aber würde etwas wie diese Arbeit:
SELECT value, attribute_definition_id, value_rk
FROM attribute_values
GROUP BY value
ORDER BY attribute_definition_id;
Noch einmal, ich bin nicht wirklich sicher, welche Spalte es Sie zu begrenzen sind versuchen, oder wie Sie wollen, es zu begrenzen.
Weniger elegant als ich möchte ---- es ist im Wesentlichen, was Sie tun, nur in reinen SQL --- aber es funktioniert und können alle in SQL erfolgen.
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
Sie können eine depVal2 und andere mit dieser Methode hinzufügen.
Ich denke
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
arbeitet
Wie von John Fiala, die kanonische Antwort in SQL Server ist eine Gruppe von Klausel zu verwenden, wenn Sie einen „deutlichen“ Betrieb über eine Teilmenge von Spalten durchführen möchten. Warum ist dies die richtige kanonische Antwort? Nun, Sie wollen in Spalten ziehen, die nicht Teil Ihrer „distinct“ Gruppe sind. Genau das, was Zeilen haben Sie für diese Tochtergesellschaft Spalten ziehen in möchten? eine Gruppe von Klausel ist und Aggregatfunktionen für diese Tochtergesellschaft Spalten Mit Hilfe macht Ihre Abfrage in dem Sinne, gut erzogene, dass Sie jetzt wissen, wie diese Tochtergesellschaft Spalten erhalten werden. Dieser Artikel gibt weitere Details:
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
Außerdem ist es erwähnenswert, dass MIN und MAX auf Text und einige andere Datentypen arbeiten, die nicht numerische Werte sind.