10
votes

Obtenir le dernier enregistrement en SQL dans la condition

J'ai indemble contenant deux champ pronon_id et statut xxx

dans cette situation dont j'ai besoin Pour afficher le dernier statut de pronau_id 1 Ie est Statut 4. peut m'aider à m'aider dans cette requête.


3 commentaires

S'il n'y a pas de colonne «séquence» ou une date ou quelque chose que vous ne pouvez jamais trouver le statut «dernier» de manière cohérente. Selon la manière dont votre table est indexée, si votre plan de requête utilisera plusieurs CPU, etc., vous obtiendrez des résultats incohérents.


C'est en fait possible. Je peux vous faire un SQL pour cela, si vous le voulez vraiment. Bien que cela semble être une demande étrange. Mais je suppose que cela peut être utile pour une table en rondine qui n'a jamais été touchée d'autre que d'insertion.


Je suis vraiment désolé pour la question que j'ai posée. Je ne savais pas à ce sujet et était vraiment prêt à baisser le vote


9 Réponses :


2
votes

Mais si durer = dernier inséré, ce n'est pas possible pour le schéma actuel, jusqu'à un addition PK:

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


3 commentaires

Je ne cherche pas celui-ci. Pourquoi l'ordre par statut desc Je n'ai pas compris. En fait, je cherchais le dernier statut de prêt_id 1.


Aucune des requêtes ne renvoie 4 selon la demande de OP - les deux retourneraient 6 .


Cette requête m'a aidé à récupérer la dernière date de la table.



6
votes

Votre table a-t-elle lieu d'avoir un identifiant principal ou un horodatage? Sinon, ce que vous voulez n'est pas vraiment possible.

Si oui alors: xxx


0 commentaires

4
votes

Je suppose qu'avec "le dernier statut", vous voulez dire l'enregistrement qui a été inséré récemment? AFAIK Il n'ya aucun moyen de faire une telle requête à moins que vous ajoutez de l'horodatage dans votre table où vous stockez la date et l'heure à laquelle l'enregistrement a été ajouté. Les RDBM ne conservent aucun ordre interne des enregistrements.


0 commentaires

18
votes

Depuis que la "dernière" ligne pour ID 1 n'est ni le minimum ni le maximum, vous vivez dans un état de confusion légère. Les rangées dans une table n'ont pas de commande. Donc, vous devriez fournir une autre colonne, éventuellement la date / heure lorsque chaque ligne est insérée, pour fournir le séquençage des données. Une autre option pourrait être une colonne distincte et incrémentée automatiquement qui enregistre la séquence dans laquelle les lignes sont insérées. Ensuite, la requête peut être écrite.

Si la colonne supplémentaire est appelée Status_ID code>, vous pouvez écrire: P>

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


1 commentaires

merci probablement je ne savais probablement pas celui-ci, je devrais probablement chercher une autre colonne pour regarder son maximum



0
votes

Utilisez un lecteur de données. Quand il quitte la boucle tandis que ce sera sur la dernière rangée. Comme les autres affiches ont déclaré sauf si vous avez mis une sorte sur la requête, l'ordre de la ligne pourrait changer. Même s'il y a un index en cluster sur la table, il pourrait ne pas renvoyer les lignes dans cet ordre (sans trier sur l'indice en cluster).

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


0 commentaires

0
votes

dans la base de données Oracle c'est très simple.

Sélectionnez * à partir de (SELECT * à partir de la commande indapable par Rownum Desc) où Rownum = 1


0 commentaires

0
votes

Salut si cela n'a pas encore été résolu. Pour obtenir le dernier enregistrement pour n'importe quel champ d'une table, le moyen le plus simple serait d'ajouter un ID à chaque enregistrement Dites PID. Disent également que dans votre table, vous souhaitez utiliser le dernier enregistrement pour chaque "nom", exécutez la requête simple xxx

Vous devez maintenant avoir une table contenant les noms dans une colonne et le dernier ID disponible pour ce nom. Maintenant, vous pouvez utiliser une jointure pour obtenir les autres détails à partir de votre table principale, disons que ceci est un prix ou une date d'exécution, puis exécutez ce qui suit: xxx

Cela devrait alors vous donner le dernier Les enregistrements pour chaque nom, pour le premier enregistrement exécutent les mêmes requêtes que ci-dessus, il suffit de remplacer le max par Min ci-dessus.

Ceci doit être facile à suivre et devrait fonctionner plus rapidement et doit être plus rapide


0 commentaires

0
votes

Si vous n'avez pas de colonnes d'identification, vous pouvez utiliser pour obtenir l'ordre d'insertion. Vous pouvez toujours le faire comme ça. Mais c'est hacky et pas très joli. XXX

Donc, vous obtenez «l'ordre naturel» si vous pouvez l'appeler et ajouter une colonne avec toutes les mêmes données. Ceci peut être utilisé pour trier par «l'ordre naturel», vous donner une opportunité de placer une colonne de numéro de ligne sur la requête suivante.

Personnellement, si le système que vous utilisez n'a pas de timbre. / Colonne d'identité et les utilisateurs actuels utilisent "l'ordre naturel", j'ajouterais rapidement une colonne et utilisez cette requête pour créer une sorte de timbre / clé incrémentielle. Plutôt que de risquer d'avoir un mécanisme d'automatisation, changez l'ordre naturel, briser les données nécessaires.


0 commentaires

0
votes

Je pense que ce code peut vous aider:

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)


1 commentaires

Ajoutez une explication avec réponse à la manière dont cette réponse aidait à opter dans la résolution de la question actuelle