2011-08-07 14 views
5

que tengo loanTable que contiene dos campos loan_id y statusConseguir el último registro de SQL en condición WHERE

loan_id status 
============== 
1  0 
2  9 
1  6 
5  3 
4  5 
1  4 <-- How do I select this?? 
4  6 

en esta situación que necesito para mostrar la última Status de loan_id 1 es decir status 4. ¿Puede por favor ayuda yo en esta consulta.

+3

Si no hay ninguna columna "secuencia" o una fecha o algo que nunca puede encontrar el "último" estado de una manera consistente. Dependiendo de cómo esté indexada su tabla, si su plan de consulta usará varias CPU, etc. Obtendrá resultados inconsistentes. –

+0

En realidad es posible. Puedo hacerte un sql, si realmente lo quieres. Aunque parece una petición extraña. Pero supongo que puede ser útil para una tabla de registro que nunca ha sido tocada con otra cosa que insertar. –

+0

lo siento mucho por la pregunta que he hecho. No lo sabía y estaba realmente preparado para bajar el voto. –

Respuesta

12

Dado que la "última" fila para la ID 1 no es ni mínima ni máxima, usted vive en un estado de confusión leve. Las filas en una tabla no tienen orden. Por lo tanto, debe proporcionar otra columna, posiblemente la fecha/hora en que se inserta cada fila, para proporcionar la secuencia de los datos. Otra opción podría ser una columna separada, automáticamente incrementada que registra la secuencia en la que se insertan las filas. Entonces la consulta puede escribirse.

Si la columna extra se llama status_id, entonces se podría escribir:

SELECT L1.* 
    FROM LoanTable AS L1 
WHERE L1.Status_ID = (SELECT MAX(Status_ID) 
         FROM LoanTable AS L2 
         WHERE L2.Loan_ID = 1); 

(La tabla de alias L1 y L2 podrían omitirse sin confundir el DBMS o programadores de SQL con experiencia.)

Como No hay una manera confiable de saber cuál es la última fila, por lo que su consulta no tiene respuesta.

+1

gracias probablemente no sabía esto probablemente debería buscar otra columna para ver su máximo –

2

Pero si la última = último registro insertado, eso no es posible para el esquema actual, hasta una adición PK:

select top 1 status, loan_id 
from loanTable 
where loan_id = 1 
order by id desc -- PK 
+0

No estoy buscando este. por qué ordenar por estado desc no entendí. en realidad estaba buscando el último estado de loan_id 1. –

+0

Ninguna de las consultas devuelve '4' según la solicitud de OP - ambas devolverían' 6'. – ain

+0

Esta consulta me ayudó a recuperar la fecha más reciente de la tabla. –

5

¿Su tabla sucede que tiene un identificador primario o una marca de tiempo? Si no, entonces lo que quieres no es realmente posible.

Si sí, entonces:

SELECT TOP 1 status 
    FROM loanTable 
    WHERE loan_id = 1 
    ORDER BY primaryId DESC 
    -- or 
    -- ORDER BY yourTimestamp DESC 
4

que suponer que con "el último estado de" te refieres al registro que se inserta más recientemente? AFAIK no hay forma de hacer tal consulta a menos que agregue marca de tiempo en su tabla donde almacena la fecha y hora en que se agregó el registro. Los RDBMS no mantienen ningún orden interno de los registros.

0

Utilice un lector de datos. Cuando sale del ciclo while estará en la última fila. Como indicaron los otros carteles, a menos que coloque un ordenamiento en la consulta, el orden de fila podría cambiar. Incluso si hay un índice agrupado en la tabla, es posible que no devuelva las filas en ese orden (sin una clasificación en el índice agrupado).

SqlDataReader rdr = SQLcmd.ExecuteReader(); 
    while (rdr.Read()) 
    { 
    } 
    string lastVal = rdr[0].ToString() 
    rdr.Close(); 

También es posible usar un ROW_NUMBER() pero que requiere una especie y no se puede utilizar ROW_NUMBER() directamente en el caso. Pero puedes engañar creando una tabla derivada. La solución rdr anterior es más rápida.

0

En la base de datos de Oracle esto es muy simple.

SELECT * FROM (SELECT * FROM fin loanTable por desc rownum), donde rownum = 1

0

Hola, si esto no se ha resuelto todavía. Para obtener el último registro de cualquier campo de una tabla, la manera más fácil sería agregar una ID a cada registro, por ejemplo, pID.También dicen que en la tabla que le gustaría hhet el último registro para cada 'Nombre', ejecute la consulta sencilla

SELECT Name, MAX(pID) as LastID 
INTO [TableName] 
FROM [YourTableName] 
GROUP BY [Name]/[Any other field you would like your last records to appear by]  

Ahora debe tener una tabla que contiene los nombres en una columna y la última disponible ID para ese Nombre. Ahora puede utilizar una combinación de conseguir los otros detalles de su tabla principal, dicen que esto es algún precio o la fecha a continuación, ejecute el siguiente:

SELECT a.*,b.Price/b.date/b.[Whatever other field you want] 
FROM [TableName] a LEFT JOIN [YourTableName] 
ON a.Name = b.Name and a.LastID = b.pID 

esto, entonces usted debe dar los últimos registros para cada nombre, para el primer registro ejecuta las mismas consultas que las anteriores simplemente reemplaza el Max por Min anterior.

Esto debería ser fácil de seguir y debe correr más rápido, así

0

Si usted no tiene ninguna columna de identificación que puede utilizar para obtener la orden de inserción. Siempre puedes hacerlo así. Pero es hacky, y no es muy bonito.

select 
t.row1, 
t.row2, 
ROW_NUMBER() OVER (ORDER BY t.[count]) AS rownum from (
select 
    tab.row1, 
    tab.row2, 
    1 as [count] 
from table tab) t 

Así que, básicamente, usted obtiene el 'orden natural' si puede llamarlo así, y agrega una columna con todos los mismos datos. Esto se puede usar para ordenar por 'orden natural', lo que le da la oportunidad de colocar una columna de número de fila en la próxima consulta.

Personalmente, si el sistema que está utilizando no tiene una columna de marca/identidad de tiempo, y los usuarios actuales están utilizando el 'orden natural', me gustaría añadir rápidamente una columna y utilizar esta consulta para crear una especie de marca de tiempo/clave incremental. En lugar de arriesgarse a tener algún mecanismo de automatización, cambie el 'orden natural', rompiendo los datos necesarios.

0

creo que este código puede ayudarle a:

WITH cte_Loans 
AS 
(
SELECT LoanID 
     ,[Status] 
     ,ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS RN 
FROM LoanTable 
) 

SELECT LoanID 
     ,[Status] 
FROM LoanTable L1 
WHERE RN = ( SELECT max(RN) 
       FROM LoanTable L2 
       WHERE L2.LoanID = L1.LoanID) 
+0

Agregue alguna explicación con respuesta de cómo esta respuesta ayuda OP en la fijación de problema actual –

Cuestiones relacionadas