Selecionar o penultimo registro de uma tabela

1,584 views
Skip to first unread message

Maikel Andre Klitzki

unread,
Nov 4, 2009, 8:25:09 AM11/4/09
to dotn...@googlegroups.com
Bom dia.
 
Eu tenho uma tabela de Ordem de Serviço onde  vinculo o equipamento e a pessoa a gual o equipamento pertence, Levando em consideraçao que são varios ordens de serviço com equipamentos diferentes vinculado a pessoas diferentes.
 
Ai eu preciso do registro ou da ordem de serviço anterior, referente ao equipamento e a pessoa que está vinculado.
 
Levando em consideração que ID não é sequencial para cada equipamento.
 
Tabela ORDEM_SERVICO tem a chave-primária ID_ORDEM.
 

--
att

-----------------------------------
Maikel André Klitzki
Aluno do curso Técnico em Informática da Setrem
Desenvolvedor de Sistemas
maikel...@gmail.com
ABAP Developer

"Se queres ser feliz por um minuto, vinga-te; se queres ser feliz por toda a vida, perdoa."

Daniel Queiroz

unread,
Nov 4, 2009, 8:28:01 AM11/4/09
to dotn...@googlegroups.com
- Ordene pelo campo que você achar que deva
- Traga os dados para o objeto de dados (datatable por exemplo)
- Pegue quantos registros foram trazidos
- Faça um for e cheque se o indice do for é igual a Total de Registros -1

2009/11/4 Maikel Andre Klitzki <maikel...@gmail.com>



--
http://danielrq.blogspot.com/
http://jc.miesf.com.br/
http://www.miesf.com.br
http://www.vivadoracao.com.br

"Em 6 dias Deus criou o universo com a aparência de bilhões de anos de existência. OU será que Adão foi criado sendo um bebezinho?
Se um homem pode ser criado adulto, o universo também pode..."

daniel carli

unread,
Nov 4, 2009, 8:32:06 AM11/4/09
to dotn...@googlegroups.com
Isso é pog mas acho que talvez de certo, ordene de fora que os ultimos registros fiquem no inicio e da um top 2

2009/11/4 Maikel Andre Klitzki <maikel...@gmail.com>
Bom dia.

Daniel Queiroz

unread,
Nov 4, 2009, 8:33:36 AM11/4/09
to dotn...@googlegroups.com
HAEHEAHEAH....é verdade....POG total...massssssssssss.....

Como você faria?

2009/11/4 daniel carli <dansa...@gmail.com>

Bruno Gross

unread,
Nov 4, 2009, 8:44:04 AM11/4/09
to dotn...@googlegroups.com
não há como criar um sequencial?

è gambiarra bunita isso...rs

2009/11/4 Daniel Queiroz <dani...@gmail.com>



--
Visite: www.UpaLele.com

att.
Bruno Gross
Analista de Sistemas
Celular: (21) 78545483
Rádio ID: 83*39379

Esta mensagem, incluindo seus anexos, pode conter informações confidenciais e/ou privilegiadas. Se você não for a pessoa autorizada a receber esta mensagem, não pode usar, copiar ou divulgar as informações nela contidas ou tomar qualquer ação baseada nessas informações. Caso esta mensagem tenha sido recebida por engano, por favor avise imediatamente o remetente, respondendo o e-mail e em seguida elimine-a do seu sistema. Agradeço sua cooperação.

Ricardo Rocha

unread,
Nov 4, 2009, 8:54:41 AM11/4/09
to dotn...@googlegroups.com
O ID não é sequencial, mas ele diminui ???
Normalmente uma chave só aumenta.

Se vc colocasse um campo Data de Inclusão, vc poderia resolver mais facilmente ...
Note que vc tem dados que não sabe a sequencia que foram incluídos ... e quer pegar o penultimo !!!




Ricardo José Alves da Rocha
Porto Alegre - RS


2009/11/4 Maikel Andre Klitzki <maikel...@gmail.com>
Bom dia.

Juliano Nunes

unread,
Nov 4, 2009, 9:07:43 AM11/4/09
to dotn...@googlegroups.com
Se for SQL Server 2005 ou posterior use uma query como esta (utilizando CTE):
 
WITH MSP_CALENDARS AS
(
 SELECT 
  *,ROW_NUMBER() OVER(ORDER BY CAL_UID ASC) AS 'RowNumber',
  ROWCOUNT_BIG() AS 'RowCount'
 FROM ProjectServer_Published.dbo.MSP_CALENDARS
)
SELECT *
FROM MSP_CALENDARS
WHERE [RowNumber] = [RowCount] - 1
 
 
PS: Os nomes das tabelas são MS Project Server 2007 que usei para criar a query. Basta substituir estes nomes.


 
2009/11/4 Ricardo Rocha <ricardor...@gmail.com>

Ricardo Noronha de Menezes

unread,
Nov 4, 2009, 9:29:58 AM11/4/09
to dotn...@googlegroups.com
Nas informações referente a Ordem de Serviço na tem o campo DATA, porque se tiver faz uma query em ordem decrescente usando a identificação da pessoa e do equipamento como parâmetros!

Obs.: Ordem anterior é algo relativo.

Se você não tiver um campo data, é bom dar uma olhada nessa base!




De: Maikel Andre Klitzki <maikel...@gmail.com>
Para: dotn...@googlegroups.com
Enviadas: Quarta-feira, 4 de Novembro de 2009 10:25:09
Assunto: [.Net - BR] Selecionar o penultimo registro de uma tabela


Veja quais são os assuntos do momento no Yahoo! + Buscados: Top 10 - Celebridades - Música - Esportes

Vinicius Quaiato

unread,
Nov 4, 2009, 10:06:07 AM11/4/09
to dotn...@googlegroups.com
Eu não faria isso no banco de dados... talvez traria todas as OSs e então pegaria a que eu quero.

Agora para fazer pelo banco... vc está no MS-SQL, Oracle,  Mysql?

Att,
Vinicius Quaiato
www.viniciusquaiato.com


2009/11/4 Ricardo Noronha de Menezes <ricar...@yahoo.com.br>

Ricardo Rocha

unread,
Nov 4, 2009, 10:11:50 AM11/4/09
to dotn...@googlegroups.com
Por que não faria no banco ???

Vc vai ter um custo para executar o comando (dezenas de registros é tranquilo ... milhares/milões já não é) ... depois tem o tráfego de rede e por fim o custo para percorrer os itens e selecionar o desejado.

Eu faria isso no banco por questões de performance. Dependendo da quantidade de utilizações (talvez até simultâneas) teríamos um custo alto em fazer via aplicação.

[]'s


Ricardo José Alves da Rocha
Porto Alegre - RS


2009/11/4 Vinicius Quaiato <vinicius...@gmail.com>

Vinicius Quaiato

unread,
Nov 4, 2009, 10:19:45 AM11/4/09
to dotn...@googlegroups.com
ué, vc não vai trazer todas as OSs do banco, imagino que pelo que foi dito somente trará as OSs de um equipamento e de uma pessoa, ou seja
where pessoaID = 10 and equipamentoId = 2

Desta forma você terá apenas as OSs da pessoa X com o equipamento Y, isso não vai te trazer mais do que 10, ou 15 registros... A não ser que o equipamento seja realmente um lixo, ahahahahah.

Desta forma não há custo nenhum.


Att,
Vinicius Quaiato
www.viniciusquaiato.com


2009/11/4 Ricardo Rocha <ricardor...@gmail.com>

Juliano Nunes

unread,
Nov 4, 2009, 10:20:48 AM11/4/09
to dotn...@googlegroups.com
Acho que o pensamento de que é mais lento rodar consultas diretamente no banco já é passado (Não sei se é esta a preocupação do Vinícius). Isso vai depender dos índices da tabela e da query (como ela é construída).
 
Concordo com o Ricardo que o tráfego de rede não iria compensar, mesmo se você enviasse somente as chaves da tabela, pois neste caso teremos 2 round-trips para chegar ao resultado desejado.

2009/11/4 Ricardo Rocha <ricardor...@gmail.com>

Vinicius Quaiato

unread,
Nov 4, 2009, 10:24:34 AM11/4/09
to dotn...@googlegroups.com
É o seguinte... imagino que exista um método ObterTodasOSClientePorEquipamento

Sendo assim, trabalharia com o resultado desse método, ao invés de criar um método ObterPenultimaOSClientePorEquipamento

Faz mais sentido o primeiro método do que o segundo...

Minha preocupação não é com velocidade. E sim com a questão acima. Não acho muito produtivo ficar criando queries bizarras que fazem esse tipo de coisa =D
É só a minha opinião. Trabalhar com um repositorio e não com queries especificas.


Att,
Vinicius Quaiato
www.viniciusquaiato.com


Ricardo Rocha

unread,
Nov 4, 2009, 10:27:09 AM11/4/09
to dotn...@googlegroups.com
Risossss

Também acredito que tenha um relacionamento.

Mas OS não é obrigatoriamente para manutenção de hardware ... pode ser de software. E se elevar em conta que muitas vezes um equipamento pode mudar de setor ou usuário, e isso provavelmente demandará novos softwares (e inclusive uma OS para a mudança), pode acabar tendo várias ....

Logicamente não deverão ser milhares de registros, mas ainda assim, se posso reduzir o custo a praticamente zero fazendo o "select certo" por que traria para a aplicação esse custo ???

Podemos cair aqui no tema de outras discussões: "Otimização prematura".
Não é meu desejo mudar o rumo da thread, mas se for possível fazer no banco, não traria para a aplicação. (a soma de pequenos detalhes pode fazer uma diferença grande no todo!!).

PS.: Tenho esperança que a tabela tenha campo de data .... daí facilita !! hehehehe

Juliano Nunes

unread,
Nov 4, 2009, 10:31:30 AM11/4/09
to dotn...@googlegroups.com
Entendi seu ponto de vista Vinicius. Você está levando em consideração que haverão filtros que não permitirão o retorno de milhares/milhões/etc de registros.
 
A idéia da query com CTE é que mesmo sendo bizarra =D você não tenha que fazer manutenção em código se precisar alterar algo na consulta. Mas vai do requisito do Maikel para decidir o que será melhor.
 
De qualquer forma concordo com vc que ele poderia trazer os dados (caso realmente sejam poucos - o que já é meio subjetivo) e tratar no lado cliente.

2009/11/4 Vinicius Quaiato <vinicius...@gmail.com>

Ricardo Rocha

unread,
Nov 4, 2009, 10:32:00 AM11/4/09
to dotn...@googlegroups.com
Bom ... daí o foco é um pouco diferente.

Não entendi o porque de querer a PENULTIMA OS ao invés da última. Poderia ser para incrementar uma chave composta ou para exibir histórico, porém ainda assim entendo o porquê da necessidade (apesar dela existir .. senão não teríamos a thread. ... heh)


Vinicius,
Ainda sou um pouco verde na utilização de repositórios, mas daí te pergunto: Se é algo que SEMPRE precisarei, não seria mais "correto" criar o método para a finalidade?
A necessidade do Maikel, para mim, seria como eu querer pegar os 10 últimos posts de um blog e trazer todos para depois fazer o loop na aplicação e ver quais são os 10 que eu preciso.

Vinicius Quaiato

unread,
Nov 4, 2009, 10:32:18 AM11/4/09
to dotn...@googlegroups.com
Cara, eu parti do primeiro post da thread:
"Eu tenho uma tabela de Ordem de Serviço onde  vinculo o equipamento e a pessoa a gual o equipamento pertence"

Ele foi bem claro dizendo equipamento, desta forma eu trabalhei com estas informações, e não tentei imaginar um cenário abstrato/genérico.

Qualquer tipo de regra de negócio eu trato na aplicação, esta é minha abordagem. E aí entra a não otimização prematura. Se ficar pesado, ruim, e não interessante fazer isso na aplicação, só depois de constatar isso é que eu vou analisar outras formas de fazer.

Vinicius Quaiato

unread,
Nov 4, 2009, 10:36:00 AM11/4/09
to dotn...@googlegroups.com
Se você tem uma collection com 10 itens e quer o penúltimo, não precisa fazer nenhum loop...

E sobre o repositório... eu trabalharia ele com métodos claros e bem definidos em uma interface unificada.

Mas é apenas minha opinião. Traria os itens que satisfazem minha restrição (where) e aí manipularia de qualquer forma que a regra mande.


Att,
Vinicius Quaiato
www.viniciusquaiato.com


2009/11/4 Ricardo Rocha <ricardor...@gmail.com>

Vinicius Quaiato

unread,
Nov 4, 2009, 11:04:35 AM11/4/09
to dotn...@googlegroups.com
---------- Forwarded message ----------
From: Maikel Andre Klitzki <maikel...@gmail.com>
Date: 2009/11/4
Subject: Re: [.Net - BR] Re: Selecionar o penultimo registro de uma tabela
To: Vinicius Quaiato <vinicius...@gmail.com>


Obrigado Vinicius
 
Deu certo a tua dica montei a SQL conforme vc me passou o exemplo, e o retornou o valor desejado.
 
Obrigado pela ajuda.

2009/11/4 Vinicius Quaiato <vinicius...@gmail.com>
Cara o firebird tem esse esquema aqui:
http://scott.yang.id.au/2004/01/limit-in-select-statements-in-firebird/

SELECT FIRST 2 SKIP 1 column1, column2, column3 FROM foo
Att,
Vinicius Quaiato
www.viniciusquaiato.com


2009/11/4 Maikel Andre Klitzki <maikel...@gmail.com>

Eu estou com o banco FireBird.

2009/11/4 Vinicius Quaiato <vinicius...@gmail.com>

Juliano Nunes

unread,
Nov 4, 2009, 11:08:30 AM11/4/09
to dotn...@googlegroups.com
Valeu pelo feedback para o grupo Vinicius.
 
Não sabia que o FireBird possuia o SKIP. Interessante.

2009/11/4 Vinicius Quaiato <vinicius...@gmail.com>

Maikel Andre Klitzki

unread,
Nov 4, 2009, 11:14:44 AM11/4/09
to dotn...@googlegroups.com
Obrigado.
A todos que responderam e deram a sua opinião, mas o exemplo do Vinicios deu certo com o SKIP.
 
Obrigado a todos.

Anderson Fraga

unread,
Nov 4, 2009, 11:19:17 AM11/4/09
to dotn...@googlegroups.com
    Em MySQL não seria algo como:
 
    SELECT coluna FROM tabela ORDER BY id DESC LIMIT 1,2;
 
    ????
 
    Isso?
 

Vinicius Quaiato

unread,
Nov 4, 2009, 11:21:45 AM11/4/09
to dotn...@googlegroups.com
Acho que limit 2,1

não lembro... mas é isso mesmo.


Att,
Vinicius Quaiato
www.viniciusquaiato.com


2009/11/4 Anderson Fraga <gro...@andersonfraga.net>

Ricardo Noronha de Menezes

unread,
Nov 4, 2009, 11:31:09 AM11/4/09
to dotn...@googlegroups.com
Essa questão de fazer as coisas via BD ou Aplicação tem causado debates.

Acho que fazer via aplicação depende do porte e do cenário:

Por via de regra acredito que:

1. E sempre bom FAZER NA APLICAÇÃO quando esta não demanda um grande número de usuários simultâneos e exige a possibilidade de se implantá-la em mais de um SGBD.

2. E sempre bom FAZER NO SGBD quando a aplicação demanda um grande número de usuários ou a aplicação seja para empresas que tem um infra-estrutura com um SGBD definido.

De: Ricardo Rocha <ricardor...@gmail.com>
Para: dotn...@googlegroups.com
Enviadas: Quarta-feira, 4 de Novembro de 2009 12:11:50
Assunto: [.Net - BR] Re: Selecionar o penultimo registro de uma tabela

Anderson Fraga

unread,
Nov 4, 2009, 11:39:08 AM11/4/09
to dotn...@googlegroups.com
SELECT coluna FROM tabela ORDER BY id DESC LIMIT 1,1;
 
Efetuei um teste e assim deu certo :)
 
Desculpem-me pelo OFF, mas fica a dica ;)

Ricardo Noronha de Menezes

unread,
Nov 4, 2009, 11:45:14 AM11/4/09
to dotn...@googlegroups.com
Um pergunta:

Se preciso apenas de UM PARTE dos dados por quê pagar o CUSTO DE TODOS para no final ter que "pagar" mais ainda para filtrar os registros quero.

Acho que Isso não é o modelo que vise a performance.

A questão da query, foi é fruto de uma má comunicação, poderia fazer

ObterOS(ByVal Pessoa As Pessoa, ByVal Coisa As Coisa) As OS()

onde esse método utiliza uma Stored Procedure que recebe os parâmetros mencionados

É fácil de entender, utilizado OO e tem um melhor desempenho!


De: Juliano Nunes <julia...@gmail.com>
Para: dotn...@googlegroups.com
Enviadas: Quarta-feira, 4 de Novembro de 2009 12:31:30
Assunto: [.Net - BR] Re: Selecionar o penultimo registro de uma tabela

Vinicius Quaiato

unread,
Nov 4, 2009, 11:52:57 AM11/4/09
to dotn...@googlegroups.com
Não gosto de SPs.
Evito utilizá-las.

Entendo que em algumas situações muito críticas elas tenham seu valor. Mas eu evito ao máximo sempre que puder.

1 - Não fica claro para quem vê o código a lógica utilizada pela SP;
2 - É extremamente difícil o "debug" para entender onde está  o erro em uma SP;
3 - É complicado versionar;

Acho uma boa usar SP's para CRUDs, e evitar ao máximo outras utilizações.


Att,
Vinicius Quaiato
www.viniciusquaiato.com


2009/11/4 Ricardo Noronha de Menezes <ricar...@yahoo.com.br>
Um pergunta:


Se preciso apenas de UM PARTE dos dados por quê pagar o CUSTO DE TODOS para no final ter que "pagar" mais ainda para filtrar os registros quero.

Acho que Isso não é o modelo que vise a performance.

A questão da query, foi é fruto de uma má comunicação, poderia fazer

ObterOS(ByVal Pessoa As Pessoa, ByVal Coisa As Coisa) As OS()

onde esse método utiliza uma Stored Procedure que recebe os parâmetros mencionados

É fácil de entender, utilizado OO e tem um melhor desempenho!


De: Juliano Nunes <juliano.net@gmail.com>

Juliano Nunes

unread,
Nov 4, 2009, 11:56:59 AM11/4/09
to dotn...@googlegroups.com
Ricardo,
 
Acho que isso depende do ambiente onde a aplicação irá executar. Em locais onde o servidor de banco de dados não é tão robusto, a quantidade de usuários simultâneos é razoavelmente alta e as estações de trabalho (além da rede) são máquinas atualizadas (me refiro a processadores que estão em comercialização, ou seja, descartando Pentium III ou similares), acho mais interessante utilizar a idéia do "dividir para conquistar".
 
Mas como tudo que discutimos aqui, na minha opinião as decisões não podem ser tomadas considerando apenas um caso, uma regra genérica ou de maneira que não possam ser adaptadas.
 
=D
 
 
Um abraço.

2009/11/4 Ricardo Noronha de Menezes <ricar...@yahoo.com.br>
Um pergunta:


Se preciso apenas de UM PARTE dos dados por quê pagar o CUSTO DE TODOS para no final ter que "pagar" mais ainda para filtrar os registros quero.

Acho que Isso não é o modelo que vise a performance.

A questão da query, foi é fruto de uma má comunicação, poderia fazer

ObterOS(ByVal Pessoa As Pessoa, ByVal Coisa As Coisa) As OS()

onde esse método utiliza uma Stored Procedure que recebe os parâmetros mencionados

É fácil de entender, utilizado OO e tem um melhor desempenho!


De: Juliano Nunes <juliano.net@gmail.com>
Reply all
Reply to author
Forward
0 new messages