none
Verificar acessos simultâneos RRS feed

  • Pergunta

  • Galera boa tarde!

    Tenho o seguinte problema

    Tenho o horário de entrada e o horário de saída e preciso da informação de quando havia mais pessoas conectadas simultaneamente.

    Com essa informação de login 

    e Logout 

    Por exemplo:

    Login           logout 

    14:02:02 14:05:09

    14:03:06 14:06:55

    14:06:01 14:30:09

    desta maneira sei q o maior número de acesso simultâneo foram 2

    pois qdo o terceiro logou o primeiro já tinha desligado 

    terça-feira, 2 de abril de 2013 18:11

Respostas

  • Deleted
    • Marcado como Resposta Brown11 terça-feira, 9 de abril de 2013 17:29
    terça-feira, 2 de abril de 2013 22:40
  • Brown,

    Segue mais um exemplo sem a criação de N tabelas:

    IF(OBJECT_ID('T0') IS NOT NULL)
    	DROP TABLE T0
    
    IF(OBJECT_ID('T1') IS NOT NULL)
    	DROP TABLE T1
    	
    CREATE TABLE T1
    (
    	Usuario	INT,
    	LogON	TIME,
    	LogOUT	TIME
    )
    
    CREATE TABLE T0
    (
    	Operacao	VARCHAR(100),
    	Sessao		INT,
    	Horario		DATETIME
    )
    
    INSERT INTO T0(Operacao, Sessao, Horario)
    VALUES
    ('LOGIN',1, '2010-10-05 14:02:02.000'),
    ('LOGOUT',1, '2010-10-05 14:05:09.027'),
    ('LOGIN',2, '2010-10-05 14:03:06.000'),
    ('LOGOUT',2, '2010-10-05 14:06:55.027'),
    ('LOGIN',3, '2010-10-05 14:06:01.000'),
    ('LOGOUT',3, '2010-10-05 14:30:09.027'),
    ('LOGIN',4, '2010-10-05 14:03:07.000'),
    ('LOGOUT',4, '2010-10-05 14:03:08.027')
    
    ;WITH CTE(Operacao, Sessao, Horario, RNK)
    AS
    (
    	SELECT Operacao, Sessao, Horario, ROW_NUMBER() OVER(PARTITION BY Sessao, Operacao ORDER BY Horario)
    	FROM T0
    )
    
    SELECT
    y.[Login],
    y.[LogOut],
    QtdeLogadoSimultaneo
    FROM
    (
    	SELECT
    	x.[Login],
    	x.[LogOut],
    	QtdeLogadoSimultaneo,
    	ROW_NUMBER() OVER (ORDER BY QtdeLogadoSimultaneo DESC) As RNK
    	FROM
    	(
    		SELECT DISTINCT
    			a.Sessao,
    			a.Horario As [Login],
    			b.Horario As [LogOut],
    			(
    				SELECT COUNT(DISTINCT Sessao)
    				FROM CTE c 
    				WHERE
    					(c.Horario BETWEEN a.Horario AND b.Horario AND c.Operacao LIKE 'LOGIN')
    					OR
    					(c.Horario BETWEEN a.Horario AND b.Horario AND c.Operacao LIKE 'LOGOUT')
    			) As QtdeLogadoSimultaneo
    		FROM CTE a
    		INNER JOIN CTE b
    			ON (a.Sessao = b.Sessao
    				AND a.RNK = b.RNK
    				AND a.Operacao LIKE 'LOGIN'
    				AND b.Operacao LIKE 'LOGOUT'
    				)
    	) x
    ) y
    WHERE y.RNK = 1


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta Brown11 terça-feira, 9 de abril de 2013 17:30
    segunda-feira, 8 de abril de 2013 16:29
    Moderador
  • Deleted
    • Marcado como Resposta Brown11 terça-feira, 14 de maio de 2013 15:09
    segunda-feira, 8 de abril de 2013 19:53
  • Brown,

    É isso mesmo, apenas a T0, o create e drop da T1 ficou como "resto" da codificação anterior rs...


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta Brown11 terça-feira, 14 de maio de 2013 15:09
    quarta-feira, 10 de abril de 2013 13:25
    Moderador

Todas as Respostas

  • Brow11,

    Como estas informações estão sendo capturadas?

    O que você poderia fazer é realizar uma contagem com base neste período de tempo.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    terça-feira, 2 de abril de 2013 18:26
  • os dados de login e logout chegam com esta estrutura: 2013-03-17 09:25:51.113

    terça-feira, 2 de abril de 2013 18:33
  • Boa tarde,

    Experimente mais ou menos dessa forma:

    with CTE_C as
    (
        select 
            t.[Id],
            COUNT(*) as QtdAcessos
        from Tabela as t
        inner join Tabela as s
            on s.Login <= t.Logout and
               s.Logout >= t.Login
        group by
            t.[Id]
    )
    
    select top 1 QtdAcessos 
    from CTE_C
    order by QtdAcessos desc
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 2 de abril de 2013 19:11
  • Na verdade gapimex eu quero saber qual momento em um período tinha mais gente logado.
    terça-feira, 2 de abril de 2013 20:53
  • Olhando novamente percebi que a query que sugeri não vai retornar o resultado correto.

    O periodo que você pretende analisar pode ser limitado a quanto tempo? 1 dia? 1 semana?

    Não sei ao certo, mas acho que talvez exista alguma possibilidade se o periodo for pequeno, e de preferência se o resultado tiver precisão de minutos.


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 2 de abril de 2013 21:46
  • Deleted
    • Marcado como Resposta Brown11 terça-feira, 9 de abril de 2013 17:29
    terça-feira, 2 de abril de 2013 22:40
  • Brown,

    Segue um exemplo de select para a obtenção de tal retorno.

    --Montagem da tabela e inserção de dados de teste
    CREATE TABLE T1
    (
    	Usuario	INT,
    	LogON	TIME,
    	LogOUT	TIME
    )
    
    INSERT INTO T1(Usuario, LogON, LogOUT)
    VALUES
    (1, '14:02:02', '14:05:09'),
    (2, '14:03:06', '14:06:55'),
    (3, '14:06:01', '14:30:09')
    
    --Select final
    ;WITH CTE(Usuario, Maximo)
    AS
    (
    	SELECT
    		a.Usuario,
    		(
    					SELECT COUNT(DISTINCT Usuario) FROM T1 b WHERE								(
    																				a.LogON >= b.LogON
    																				AND a.LogON <= b.LogOUT
    																				)
    				) As TotalLogadoSimultaneoComEsteUsuario
    	FROM T1 a
    )
    SELECT a.Maximo, b.LogON, b.LogOUT
    FROM CTE a
    INNER JOIN T1 b
    	ON (a.Usuario = b.Usuario
    		AND a.Usuario IN (SELECT c.Usuario FROM CTE c WHERE c.Maximo = (SELECT MAX(d.Maximo) FROM CTE d))
    		)


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 3 de abril de 2013 11:29
    Moderador
  • Amigos bom dia 

    Irei analisar agora as modelos acima e respondo logo logo

    desde já mto obrigado pela ajuda

    OBS: período minimo 1 dia

    ou seja a maior quantidade simultânea em um dia.

    Abraço

    quarta-feira, 3 de abril de 2013 13:53
  • Rapaziada cometi um erro grotesco passei a estrutura errada dos dados 

    Na verdade o campo login não vem só com horas e sim neste formato

    "2013-04-01 10:24:40.933"

    e a estrutura 

     na verdade não esta em linha e sim em coluna 

    Eu identifico que é um login e um logon igualando a sessão

    Operação                        sessão                                 time        
    
    LOGIN      	    xqaz3u55kj0xx3fre0hgtg45      	        2010-10-05 17:30:23.000	
    LOGOUT              xqaz3u55kj0xx3fre0hgtg45     	        2010-10-05 16:13:05.027	

    estava seguindo este caminho 

    select campos 

    from( select campos from tabela

    where operacao = 'LOGIN') x, 

    select campos from tabela 

    where operacao = 'LOGOUT') y

    where x.sessao = y.sessao

    e desta forma tentando adequar aos exemplos

    abraço e desculpe ai pela falta de atenção

      

    quarta-feira, 3 de abril de 2013 14:41
  • Brown,

    Segue um exemplo utilizando meu codigo anterior porem para o novo formato de dados:

    IF(OBJECT_ID('T0') IS NOT NULL)
    	DROP TABLE T0
    
    IF(OBJECT_ID('T1') IS NOT NULL)
    	DROP TABLE T1
    	
    CREATE TABLE T1
    (
    	Usuario	INT,
    	LogON	TIME,
    	LogOUT	TIME
    )
    
    CREATE TABLE T0
    (
    	Operacao	VARCHAR(100),
    	Sessao		INT,
    	Horario		DATETIME
    )
    
    INSERT INTO T0(Operacao, Sessao, Horario)
    VALUES
    ('LOGIN',1, '2010-10-05 14:02:02.000'),
    ('LOGOUT',1, '2010-10-05 14:05:09.027'),
    ('LOGIN',2, '2010-10-05 14:03:06.000'),
    ('LOGOUT',2, '2010-10-05 14:06:55.027'),
    ('LOGIN',3, '2010-10-05 14:06:01.000'),
    ('LOGOUT',3, '2010-10-05 14:30:09.027'),
    ('LOGIN',4, '2010-10-05 14:03:07.000'),
    ('LOGOUT',4, '2010-10-05 14:03:08.027')
    
    ;WITH CTET0(Operacao, Sessao, Horario, RNK)
    AS
    (
    	SELECT Operacao, Sessao, Horario, ROW_NUMBER() OVER(PARTITION BY Sessao ORDER BY Horario)
    	FROM T0
    )
    INSERT INTO T1(Usuario, LogON, LogOUT)
    SELECT 
    	a.Sessao,
    	a.Horario,
    	b.Horario
    FROM CTET0 a
    INNER JOIN CTET0 b
    	ON (a.Sessao = b.Sessao
    		AND a.Operacao LIKE 'LOGIN'
    		AND b.Operacao LIKE 'LOGOUT'
    		)
    
    --Select final
    ;WITH CTE(Usuario, Maximo)
    AS
    (
    	SELECT
    		a.Usuario,
    		(
    					SELECT COUNT(DISTINCT Usuario) FROM T1 b WHERE								(
    																				a.LogON >= b.LogON
    																				AND a.LogON <= b.LogOUT
    																				)
    				) As TotalLogadoSimultaneoComEsteUsuario
    	FROM T1 a
    )
    SELECT a.Maximo, b.LogON, b.LogOUT
    FROM CTE a
    INNER JOIN T1 b
    	ON (a.Usuario = b.Usuario
    		AND a.Usuario IN (SELECT c.Usuario FROM CTE c WHERE c.Maximo = (SELECT MAX(d.Maximo) FROM CTE d))
    		)
    


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 3 de abril de 2013 18:26
    Moderador
  • Deleted
    quinta-feira, 4 de abril de 2013 00:23
  • Brow11,

    Será que as sys.dm_exec_connections e sys.dm_exec_sessions não poderia ajudar?

    - Listar conexões ativas

    SELECT * FROM sys.dm_exec_connections

     

    -- Listar sessões ativas

    SELECT * FROM sys.dm_exec_sessions


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quinta-feira, 4 de abril de 2013 16:37
  • Amigos hoje estive um pouco enrolado

    mas farei os teste com as soluções propostas e logo logo estarei respondendo aqui pra vcs

    Desde já peço mto obrigado a vcs

    quinta-feira, 4 de abril de 2013 20:00
  • Fabrizzio 

    entendi seu exemplo, mas vc criou duas tabelas 

    ai eu teria que mexer na estrutura do banco.

    José diz não existe índice nesta tabela 

    Testei seu exemplo :

    with SessõesAbertas as (
    select max(ES2.horario) as De, 
           DateAdd(ms, -1, ES1.horario) as até, 
           sum(case ES2.OPERATION when 'LOGIN' then 1 else -1 end) as QtdSessões
      from [mwcontroladoria].[cargasig].[EISMOVPLTMWCONTROLADORIA] as ES1 inner join
             [mwcontroladoria].[cargasig].[EISMOVPLTMWCONTROLADORIA] as ES2 on ES2.TSMANU < ES1.TSMANU
             where 1 = 1				
    				and year(ES1.horario) = '2013'
    				and MONTH(ES1.horario) = '04'
      group by ES1.TSMANU
    )
    select De, até, QtdSessões
      from SessõesAbertas
      where QtdSessões = (select max(QtdSessões) from SessõesAbertas)

    Mas o resultado não veio após 5 minutos

    vou testar mais e coloco aqui o resultado 

    mto obrigado galera

    segunda-feira, 8 de abril de 2013 15:25
  • Deleted
    segunda-feira, 8 de abril de 2013 16:05
  • Deleted
    segunda-feira, 8 de abril de 2013 16:12
  • Brown,

    Segue mais um exemplo sem a criação de N tabelas:

    IF(OBJECT_ID('T0') IS NOT NULL)
    	DROP TABLE T0
    
    IF(OBJECT_ID('T1') IS NOT NULL)
    	DROP TABLE T1
    	
    CREATE TABLE T1
    (
    	Usuario	INT,
    	LogON	TIME,
    	LogOUT	TIME
    )
    
    CREATE TABLE T0
    (
    	Operacao	VARCHAR(100),
    	Sessao		INT,
    	Horario		DATETIME
    )
    
    INSERT INTO T0(Operacao, Sessao, Horario)
    VALUES
    ('LOGIN',1, '2010-10-05 14:02:02.000'),
    ('LOGOUT',1, '2010-10-05 14:05:09.027'),
    ('LOGIN',2, '2010-10-05 14:03:06.000'),
    ('LOGOUT',2, '2010-10-05 14:06:55.027'),
    ('LOGIN',3, '2010-10-05 14:06:01.000'),
    ('LOGOUT',3, '2010-10-05 14:30:09.027'),
    ('LOGIN',4, '2010-10-05 14:03:07.000'),
    ('LOGOUT',4, '2010-10-05 14:03:08.027')
    
    ;WITH CTE(Operacao, Sessao, Horario, RNK)
    AS
    (
    	SELECT Operacao, Sessao, Horario, ROW_NUMBER() OVER(PARTITION BY Sessao, Operacao ORDER BY Horario)
    	FROM T0
    )
    
    SELECT
    y.[Login],
    y.[LogOut],
    QtdeLogadoSimultaneo
    FROM
    (
    	SELECT
    	x.[Login],
    	x.[LogOut],
    	QtdeLogadoSimultaneo,
    	ROW_NUMBER() OVER (ORDER BY QtdeLogadoSimultaneo DESC) As RNK
    	FROM
    	(
    		SELECT DISTINCT
    			a.Sessao,
    			a.Horario As [Login],
    			b.Horario As [LogOut],
    			(
    				SELECT COUNT(DISTINCT Sessao)
    				FROM CTE c 
    				WHERE
    					(c.Horario BETWEEN a.Horario AND b.Horario AND c.Operacao LIKE 'LOGIN')
    					OR
    					(c.Horario BETWEEN a.Horario AND b.Horario AND c.Operacao LIKE 'LOGOUT')
    			) As QtdeLogadoSimultaneo
    		FROM CTE a
    		INNER JOIN CTE b
    			ON (a.Sessao = b.Sessao
    				AND a.RNK = b.RNK
    				AND a.Operacao LIKE 'LOGIN'
    				AND b.Operacao LIKE 'LOGOUT'
    				)
    	) x
    ) y
    WHERE y.RNK = 1


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta Brown11 terça-feira, 9 de abril de 2013 17:30
    segunda-feira, 8 de abril de 2013 16:29
    Moderador
  • Deleted
    • Marcado como Resposta Brown11 terça-feira, 14 de maio de 2013 15:09
    segunda-feira, 8 de abril de 2013 19:53
  • só um comentário antes de mais nada esqueci de fazer a igualdade das sessões, por isso o tempo foi enorme

    mas mesmo com a igualdade demorou bastante.

    Vou adaptar os exemplos e volto aqui para comentá-los 

    Bom dia a todos e mais uma vez obrigado

    terça-feira, 9 de abril de 2013 12:31
  • Não há diferença o TSMANU é o horário mesmo esqueci de alterar, mas rodei certinho 

    qdo joguei pra cá q esqueci de alterar

    terça-feira, 9 de abril de 2013 12:33
  • José bom dia 

    Realmente não existe nenhum índice nesta tabela, e vc esta certo os dados estão na ordem de operação realizada ficando na orem de data e hora

    Apenas temos como controle a sessão q é a mesma para login e logout, mas q também não se repete para nova operação.

    Vou realizar testes com este seu novo exemplo adequando aqui ao q tenho 

    desde já mto obrigado pela ajuda


    quarta-feira, 10 de abril de 2013 13:21
  • Fabrizzio

    Parti do principio q só havia a tabela T0

    adequei aqui ao q tenho  e consegui algum resultados q acho q são os esperados

    Agora faei alguns teste para ter certeza

    Desde já mto obrigado pela ajuda! 

    quarta-feira, 10 de abril de 2013 13:24
  • Brown,

    É isso mesmo, apenas a T0, o create e drop da T1 ficou como "resto" da codificação anterior rs...


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta Brown11 terça-feira, 14 de maio de 2013 15:09
    quarta-feira, 10 de abril de 2013 13:25
    Moderador
  • Deleted
    quinta-feira, 11 de abril de 2013 15:41