SQL: количество количества отличных значений в каждом столбце

Я использовал бы группы получения в regex:

$ string="hello-world"
$ prefix="hell"
$ suffix="ld"
$ set +H # Disables history substitution, can be omitted in scripts.
$ perl -pe "s/${prefix}((?:(?!(${suffix})).)*)${suffix}/\1/" <<< $string
o-wor
$ string1=$string$string
$ perl -pe "s/${prefix}((?:(?!(${suffix})).)*)${suffix}/\1/g" <<< $string1
o-woro-wor

((?:(?!(${suffix})).)*) удостоверяется, что содержание ${suffix} будет исключено из группы получения. С точки зрения примера это - строка, эквивалентная [^A-Z]*. Иначе Вы доберетесь:

$ perl -pe "s/${prefix}(.*)${suffix}/\1/g" <<< $string1
o-worldhello-wor
7
задан Ryan 15 July 2012 в 03:03
поделиться

6 ответов

Я ценю все ответы. Я думаю, что решение, которое лучше всего подойдет мне в этой ситуации (подсчет количества различных значений в каждом столбце таблицы из внешней программы, которая ничего не знает о таблице, кроме ее имени), выглядит следующим образом:

Run " описать таблицу1 "и извлечь имена столбцов из результата.

Прокрутите имена столбцов и создайте запрос для подсчета различных значений в каждом столбце. Запрос будет выглядеть примерно так: «выберите количество (отдельный столбецA), количество (отдельный столбецB), ... из таблицы1».

0
ответ дан 7 December 2019 в 14:36
поделиться

попробуйте это (синтаксис sql server 2005):

DECLARE @YourTable table (col1  varchar(5)
                         ,col2  int
                         ,col3  datetime
                         ,col4  char(3)
                         )

insert into @YourTable values ('abcdf',123,'1/1/2009','aaa')
insert into @YourTable values ('aaaaa',456,'1/2/2009','bbb')
insert into @YourTable values ('bbbbb',789,'1/3/2009','aaa')
insert into @YourTable values ('ccccc',789,'1/4/2009','bbb')
insert into @YourTable values ('aaaaa',789,'1/5/2009','aaa')
insert into @YourTable values ('abcdf',789,'1/6/2009','aaa')


;with RankedYourTable AS
(
SELECT
    ROW_NUMBER() OVER(PARTITION by col1 order by col1) AS col1Rank
        ,ROW_NUMBER() OVER(PARTITION by col2 order by col2) AS col2Rank
        ,ROW_NUMBER() OVER(PARTITION by col3 order by col3) AS col3Rank
        ,ROW_NUMBER() OVER(PARTITION by col4 order by col4) AS col4Rank
    FROM @YourTable
)
SELECT
    SUM(CASE WHEN      col1Rank=1 THEN 1 ELSE 0 END) AS col1DistinctCount
        ,SUM(CASE WHEN col2Rank=1 THEN 1 ELSE 0 END) AS col2DistinctCount
        ,SUM(CASE WHEN col3Rank=1 THEN 1 ELSE 0 END) AS col3DistinctCount
        ,SUM(CASE WHEN col4Rank=1 THEN 1 ELSE 0 END) AS col4DistinctCount
    FROM RankedYourTable

ВЫВОД:

col1DistinctCount col2DistinctCount col3DistinctCount col4DistinctCount
----------------- ----------------- ----------------- -----------------
4                 3                 6                 2

(1 row(s) affected)
4
ответ дан 7 December 2019 в 14:36
поделиться

Этот код должен предоставить вам все столбцы в 'table1' с соответствующим количеством отдельных значений для каждого в качестве данных.

DECLARE @TableName VarChar (Max) = 'table1'
DECLARE @SqlString VarChar (Max)

set @SqlString = (
  SELECT DISTINCT
    'SELECT ' + 
        RIGHT (ColumnList, LEN (ColumnList)-1) + 
      ' FROM ' + Table_Name
    FROM INFORMATION_SCHEMA.COLUMNS COL1
      CROSS AppLy (
        SELECT ', COUNT (DISTINCT [' + COLUMN_NAME + ']) AS ' + '''' + COLUMN_NAME + ''''
          FROM INFORMATION_SCHEMA.COLUMNS COL2
          WHERE COL1.TABLE_NAME = COL2.TABLE_NAME
          FOR XML PATH ('')
      ) TableColumns (ColumnList)
    WHERE
      1=1 AND 
      COL1.TABLE_NAME = @TableName
)

EXECUTE (@SqlString)
2
ответ дан 7 December 2019 в 14:36
поделиться

и он жестко запрограммирован.

Нет необходимости в жестком кодировании предоставить список полей для оператора sql. Это обычная и приемлемая практика.

1
ответ дан 7 December 2019 в 14:36
поделиться

Это не обязательно будет возможно для каждого поля в таблице. Например, вы не можете выполнить DISTINCT для поля ntext или image SQL Server, если вы не приведете их к другим типам данных и не потеряете некоторую точность.

0
ответ дан 7 December 2019 в 14:36
поделиться

DISTINCT - зло. Сделайте COUNT / GROUP BY

-3
ответ дан 7 December 2019 в 14:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: