Avatar billede ae03 Novice
18. februar 2011 - 14:19 Der 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.
Avatar billede hrc Mester
18. februar 2011 - 14:44 #1
Det er ikke noget med Having, vel?

Noget i retning af dette: select id, count(*) from mytable group by id having count(*) < 5

Skal du have alle kolonner ud i en automatiseret kørsel?
Avatar billede ae03 Novice
18. februar 2011 - 14:52 #2
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.
Avatar billede ae03 Novice
18. februar 2011 - 14:54 #3
Det skal naturligvis være
WHERE count(x) < 5
eller noget tilsvarende med group by og having.
Avatar billede Syska Mester
18. februar 2011 - 16:54 #4
Her er lidt til column delen.

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
Avatar billede hrc Mester
19. februar 2011 - 12:59 #5
buzz: Jeg regnede også med det endte med et information_schema-opslag, men I andre er meget bedre til at lave SP'ere.
Avatar billede ae03 Novice
21. februar 2011 - 08:32 #6
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?

Vh Lars
Avatar billede Syska Mester
21. februar 2011 - 13:44 #7
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

mvh
Avatar billede ae03 Novice
21. februar 2011 - 14:39 #8
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.
Avatar billede Syska Mester
21. februar 2011 - 17:55 #9
Du skal have den brygget sammen med SELECT INTO #temptable

Det kan være en lille opgave for dig, hvis det går helt i kage, skal jeg selvfølgelig nok hjælpe.

Hjælp til selv hjælp, det lærer man mest af, og håber du synes det samme :-)

mvh
Avatar billede Syska Mester
21. februar 2011 - 18:03 #10
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

SELECT * FROM #mytemp

DROP TABLE #mytemp
Avatar billede ae03 Novice
21. februar 2011 - 18:33 #11
Så virker den helt fint. Mange tak for hjælpen.

Drop et svar.
Avatar billede Syska Mester
21. februar 2011 - 18:55 #12
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester