1 messaggio dal 06 agosto 2011
Ciao a tutti.
Ho una tabella-database così costituita:

Id**Value
1 0
2 0
3 1
4 1
5 1
6 0
7 0
8 0
9 1
10 0
11 1
12 0

Secondo voi, desiderando una select che mi restituisca come valore
il numero max degli zero consecutivi ( in tabella la serie di valori zero max consecutivi è 3) e il numero max degli 1 consecutivi ( anche in questo caso è pari 3), come bisognerebbe agire?

Grazie a chi vorrà rispondere.
frankie
Non sapendo affrontare la questione dal punto di vista di uno script SQL, ho creato un database di esempio in cui ho inserito una tabella "Serie" con la forma da te descritta, e ho usato Linq2Sql (ma fa lo stesso anche con Entity Framework) e ho scritto qualche riga di codice.
Magari non è ottimizzato e non è semplice come avresti voluto, però funziona.

public int GetMaxOccurrencesFromSeries(int iValueToCheck)
{
  int iMax = 0;
  int iCurrentMax = 1;
  int iPrevId = -1;
  
        MyContext
        .Series
        .Where(s1 => s1.Value.Equals(iValueToCheck))
        .ToList<Serie>()
        .ForEach( serie =>
  {
    if (iPrevId!=-1)
    {
      if (iPrevId.Equals(serie.Id - 1))
      {
        iCurrentMax++;  
        if (iCurrentMax > iMax)
        {
          iMax = iCurrentMax;
        }
      }
      else
      {
        iCurrentMax = 1;
      }
    }
    iPrevId = serie.Id;
  }
  );
  return iMax;
}


Ovviamente "MyContext" è l'istanza del datacontext che si sta usando.

HTH,
Roberto
Modificato da dancerjude il 08 agosto 2011 15.12 -
salve,
frankie64 wrote:
Ciao a tutti.
Ho una tabella-database così costituita:
IdValue
1 0
2 0
3 1
4 1
5 1
6 0
7 0
8 0
9 1
10 0
11 1
12 0
Secondo voi, desiderando una select che mi restituisca come valore il numero max degli zero consecutivi ( in tabella la serie di valori zero max consecutivi è 3) e il numero max degli 1 consecutivi ( anche in questo caso è pari 3), come bisognerebbe agire?
Grazie a chi vorrà rispondere.
frankie

visto che mi sembrava una cosa interessante per lui, ho scomodato un caro amico genialmente matematico... e la sua soluzione e', ovviamente, lapalissiana...

declare @T table(Id int identity primary key, V tinyint)
insert into @T values(0),(0),(1),(1),(1),(0),(0),(0),(1),(0),(1),(0),(0)
select t.V, C=max(c.C)
from @T t
outer apply(
select top 1 *
from @T n
where n.Id>t.Id and n.V!=t.V
) n
outer apply(
select C=count(*)
from @T c
where c.Id>=t.Id and (c.Id<n.Id or n.Id is null)
) c
group by t.V

Marcello Poletti
Dingo&Epomops
http://www.dingoepomops.it
http://blogs.dotnethell.it/epomops/

saluti a tutti

Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz - http://italy.mvps.org
http://www.hotelsole.com - http://www.hotelsolericcione.de

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
    In primo piano

    I più letti di oggi

    Media
    In evidenza
    MISC