18. februar 2011 - 14:19Der er
11 kommentarer og 1 løsning
Find kolonneværdier med lave counts i tabel
Jeg har 4 tabeller med mellem 1400 og 3000 rækker og mellem 200 og 250 kolonner. De fleste kolonner indeholder heltalsvariable, der hver især har mellem 2 og 10 forskellige værdier i intervallet 0 og 10. Jeg har brug for at identificere de værdier i hver kolonne, som forekommer mindre end 5 gange i kolonnen.
Desuden skal jeg finde værdier, der forekommer mindre end 5 gange i de rækker, hvor en anden kolonne har en specifik værdi, fx 1.
Er der en let måde at automaticere dette, så jeg ikke skal igennem kolonnerne enkeltvis men kan lave et udtræk af kolonnenavn, værdi og antal forekomster af værdi? Jeg foretrækker en løsning, hvor jeg kun får de værdier, som har count under 5, men en alternativ version, hvor jeg får de tre informationer for alle værdier i alle kolonner, kan også bruges, hvis det er meget lettere eller hurtigere at lave.
Det må meget gerne være en version, hvor jeg med træk og slip eller lignende ret enkelt kan angive de kolonner, som skal med i queryen. Alternativt kan det måske gøres ved at specificere, at alle kolonner i 'int'-format skal medtages.
Umiddelbart noget i retning af select (kolonne-id for kolonne A), (værdi x i kolonne A), count(værdi(A)=x)
Ja, jeg vil meget gerne have alle (relevante) kolonner ud i en eller nogle få kørsler, idet det vil tage mig en krig at eksekvere kørsler for hver enkelt kolonne. Så er det lettere for mig at køre alle i et statistikprogram og gennemgå dem manuelt.
HAVING delen ser der vist nok ud til at være styr på.
SET NOCOUNT ON DECLARE @Column VARCHAR(50) DECLARE @Query NVARCHAR(4000); set rowcount 0 SELECT COLUMN_NAME, DATA_TYPE INTO #mytemp FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = 'umbracoNode' AND DATA_TYPE = 'int'
set rowcount 1 PRINT 'Starting' SELECT @Column = COLUMN_NAME FROM #mytemp WHILE @@ROWCOUNT <> 0 BEGIN set rowcount 0 DELETE FROM #mytemp WHERE COLUMN_NAME = @Column;
PRINT 'working with the column: ' + @Column; SELECT @Query = 'SELECT ' + @Column + ' FROM umbracoNode'
EXEC(@Query)
set rowcount 1 SELECT @Column = COLUMN_NAME FROM #mytemp END DROP TABLE #mytemp
buzz: Det virker fint, men jeg render ind i følgende begrænsning:
The query has exceeded the maximum number of result sets that can be displayed in the results grid. Only the first 100 result sets are displayed in the grid.
Kan det designes, så jeg kan starte ved næste navngivne kolonne næste gang? Jeg kan se, at kolonnerne tages i rækkefølge, så det kan måske klares med en tæller og nummerering eller lignende?
SELECT col1, col2 FROM ( SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum FROM MyTable ) AS MyDerivedTable WHERE MyDerivedTable.RowNum BETWEEN @startRow AND @endRow
Så lærte jeg da en ny kommando, men jeg kan ikke lige se, hvordan jeg får bygget sammen med dit tidligere forslag, så jeg kan styre, hvilke kolonner jeg får ud i mit resultat.
hmmm, havde ikke lige noget andet at lave så her: SELECT COLUMN_NAME, DATA_TYPE INTO #mytemp FROM (SELECT COLUMN_NAME, DATA_TYPE, ROW_NUMBER() OVER (ORDER BY COLUMN_NAME) AS ColumnNumber FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = 'umbracoNode' AND DATA_TYPE = 'int' ) AS [DiveredTable] WHERE [DiveredTable].ColumnNumber BETWEEN 2 AND 4
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.