2008-09-24 12 views
5

Estoy intentando escribir una consulta que retirará las dos filas más recientes de la tabla Bill donde el indicador Estimado es verdadero. El problema es que estos deben ser facturas consecutivas.Encontrar dos filas consecutivas

Para ponerlo brevemente, necesito ingresar una fila en otra tabla si se ha estimado una factura para los últimos dos ciclos de facturación.

Me gustaría hacer esto sin un cursor, si es posible, ya que estoy trabajando con una cantidad considerable de datos y esto tiene que ejecutarse con bastante frecuencia.

Editar

Hay un (1,1) columna AutoIncrement sobre la mesa. Sin revelar demasiado de la estructura de la tabla, la tabla es esencialmente de la estructura:


CREATE TABLE Bills (
    BillId INT AUTOINCREMENT(1,1,) PRIMARY KEY, 
    Estimated BIT NOT NULL, 
    InvoiceDate DATETIME NOT NULL 
) 

lo que podría tener un conjunto de resultados como:

 
BillId    AccountId   Estimated InvoiceDate 
-------------------- -------------------- --------- ----------------------- 
1111196    1234567    1   2008-09-03 00:00:00.000 
1111195    1234567    0   2008-08-06 00:00:00.000 
1111194    1234567    0   2008-07-03 00:00:00.000 
1111193    1234567    0   2008-06-04 00:00:00.000 
1111192    1234567    1   2008-05-05 00:00:00.000 
1111191    1234567    0   2008-04-04 00:00:00.000 
1111190    1234567    1   2008-03-05 00:00:00.000 
1111189    1234567    0   2008-02-05 00:00:00.000 
1111188    1234567    1   2008-01-07 00:00:00.000 
1111187    1234567    1   2007-12-04 00:00:00.000 
1111186    1234567    0   2007-11-01 00:00:00.000 
1111185    1234567    0   2007-10-01 00:00:00.000 
1111184    1234567    1   2007-08-30 00:00:00.000 
1111183    1234567    0   2007-08-01 00:00:00.000 
1111182    1234567    1   2007-07-02 00:00:00.000 
1111181    1234567    0   2007-06-01 00:00:00.000 
1111180    1234567    1   2007-05-02 00:00:00.000 
1111179    1234567    0   2007-03-30 00:00:00.000 
1111178    1234567    1   2007-03-02 00:00:00.000 
1111177    1234567    0   2007-02-01 00:00:00.000 
1111176    1234567    1   2007-01-03 00:00:00.000 
1111175    1234567    0   2006-11-29 00:00:00.000 

En este caso, sólo los registros 1111188 y 1111187 sería consecutivo.

+0

... hacer las filas tienen un campo de ID? – Swati

+0

¿Podría publicar más información? Posiblemente un conjunto de datos de muestra para que podamos ver los casos "consecutivos" y "no consecutivos". –

+0

Como se comentó anteriormente, la respuesta depende de qué considere filas "consecutivas". Por favor dé un ejemplo. – rslite

Respuesta

11

Suponiendo que las filas tienen identificaciones consecutivas, algo como esto puede ser lo que está buscando:

select top 1 * 
from 
Bills b1 
inner join Bills b2 on b1.id = b2.id - 1 
where 
b1.IsEstimate = 1 and b2.IsEstimate = 1 
order by 
b1.BillDate desc 
+1

Creo que esta suposición puede ser defectuosa. Las inserciones fallidas (por ejemplo, una transacción 'reservada' y una identificación, pero se retrotrae), significarían que las secuencias válidas ya no son secuenciales. – Neil

0

Usted debe ser capaz de hacer una consulta ordenados en descensing estimado = true y seleccione la parte superior 2. No soy el mejor en SQL así que no puedo dar a la estructura del lenguaje exacto

0

¿Tiene una columna para el "número de extracto ", por ejemplo, si Q12008 fuera la declaración 28 para un cliente en particular, entonces la factura de Q22008 sería 29, la factura de Q32008 sería 30 (suponiendo facturación trimestral). Luego puede verificar que los números de las declaraciones sean adyacentes en lugar de tener que manipular la fecha.

2
select top 2 * 
from bills 
where estimated = 1 
order by billdate desc 
+0

gracias, de lo que estaba hablando pero no pude encontrar la consulta exacta sin tomar una while :) – mattlant

+0

¿No devolverá TODAS las facturas estimadas, solo ordenadas por fecha, descendiendo, independientemente de la continuidad? –

+0

esta consulta es exactamente cómo formuló la pregunta. Obtenga los dos últimos recibos estimados de la tabla de facturas. Si hubiera algún otro criterio, debe indicarse. – mattlant

Cuestiones relacionadas