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:)

War es hilfreich?

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

PostgreSQL Docs

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top