2012-09-20 75 views
32

Tengo un conjunto de datos que contiene las columnas Date, Cat y QTY. Lo que quiero hacer es agregar una columna única que solo cuente los valores únicos Cat cuando haga el recuento de filas. Esto es lo que yo quiero que mi conjunto de resultados para que parezca:row_number() Agrupar por?

enter image description here

Mediante el uso de la consulta SQL a continuación, soy capaz de conseguir fila usando la función row_number().

Sin embargo, no puedo obtener esa única columna que he descrito anteriormente. Cuando agrego group by a la cláusula OVER, no funciona. ¿Alguien tiene alguna idea de cómo puedo hacer que funcione esta columna de recuento única?

SELECT 
    Date,  
    ROW_NUMBER() OVER (PARTITION BY Date ORDER By Date, Cat) as ROW, 
    Cat, 
    Qty 
FROM SOURCE 

Respuesta

13
DENSE_RANK() OVER (PARTITION BY date ORDER BY cat) 
+0

Gracias, este es un paso en la dirección correcta. Sin embargo, el hecho es que mi conjunto de datos reales no está ordenado por cat. ¿Sabes cómo funcionaría en ese ejemplo? (Imagine que en mi columna cat, DEF aparece antes que ABC. Pero es cierto que los valores de DEF son consecutivos en mi orden, por lo que no verá DEF, DEF, ABC, ABC, DEF como valores en la columna cat) – user1582928

+2

@ user1582928 As por http://msdn.microsoft.com/en-us/library/ms173825.aspx " Determina el orden en que se aplica la función DENSE_RANK a las filas de una partición". Y siempre puede agregar ORDER BY al final de SELECT. – prashanth

+0

@ user1582928, si lo desea, puede especificar una función para cambiar el orden, por ejemplo: ordenar por decodificación ('DEF', 1, 'ABC', 2,3) –

31

Aquí es solución alternativa.

No necesita preocuparse por el pedido de Cat. Con el siguiente SQL, podrá obtener valores únicos para su combinación de Cat. Fecha &.

SELECT 
    Date,  
    ROW_NUMBER() OVER (PARTITION BY Date, Cat ORDER By Date, Cat) as ROW, 
    Cat, 
    Qty 
FROM SOURCE