Фильтровать элементы массива по максимуму определенного свойства

Ограничение 4k , которое удалено в выпуске служб интеграции SQL Server 2012 года, применяется только к выражениям.

Поэтому, если вам нужно спуститься по маршруту, в котором вы сейчас путешествуете, построив исходный запрос, объединив все эти идентификаторы пользователя вместе, прекратите использование выражения и выполните конкатенацию строк в задаче скрипта.

Пример кода

Dts.Variables[SourceQuery].Value = string.Format("select * from dept where dept in ({0}), Dts.Variables[EmpList].Value.ToString());

POC

Я создал простой пакет. Задача сценария, связанная с потоком данных с переменной, определенной как QuerySource, и использовать следующую логику для построения длинной строки, которая затем будет запрашивать таблицу.

            // 551 characters
            string baseQuery = @"
SELECT
    AC.object_id
,   AC.name
,   AC.column_id
,   AC.system_type_id
,   AC.user_type_id
,   AC.max_length
,   AC.precision
,   AC.scale
,   AC.collation_name
,   AC.is_nullable
,   AC.is_ansi_padded
,   AC.is_rowguidcol
,   AC.is_identity
,   AC.is_computed
,   AC.is_filestream
,   AC.is_replicated
,   AC.is_non_sql_subscribed
,   AC.is_merge_published
,   AC.is_dts_replicated
,   AC.is_xml_document
,   AC.xml_collection_id
,   AC.default_object_id
,   AC.rule_object_id
,   AC.is_sparse
,   AC.is_column_set
FROM
    sys.all_columns AS AC
WHERE
    AC.object_id IN (0{0});";
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            for (int i = 0; i < 1000; i++)
            {
                sb.Append(',');
                sb.Append(i);
            }
            string queryFinal = string.Format(baseQuery, sb.ToString());
            MessageBox.Show(queryFinal.Length.ToString());
            Dts.Variables["QuerySource"].Value = queryFinal;

При выполнении, вот

enter image description here [/g2]

Внутри моего потока данных я использую команду SQL из переменной, так как это единственное, что будет иметь смысл, учитывая, что мы используем переменную ...

enter image description here [/g3]

2
задан Nancy 16 January 2019 в 20:15
поделиться

2 ответа

Если я правильно понял ваш вопрос, то, думаю, приведенный ниже код поможет решить вашу проблему. Это все ванильный JavaScript и не использует никаких функций d3.

По сути, я проанализировал вашу строку данных в массив записей. Я анализирую текущую запись в обратном вызове reduce, чтобы увидеть, имеет ли она большее значение свойства, чем текущий элемент max - если это так, она становится новым элементом max.

Я предоставил функцию под названием getMax, которая принимает массив данных, который я упомянул, в качестве первого параметра. getMax принимает второй параметр, который используется для определения максимального значения свойства, которое вы хотите найти.

Вы можете увидеть в демонстрации ниже, что я запускаю каждое из имен ваших свойств через функцию, и вы можете видеть, как меняются наборы данных. Надеюсь, это поможет!

function parse(s) {
  return s.split('\n').filter(el => el.length);
}

function generatePropertyKey(s) {
  var suffix = s.charAt(0).toUpperCase();
  suffix += s.substring(1);
  return `max${suffix}`;
}

function getMax(data, properyName) {
  var o = data.reduce((accum, el, idx) => {
    if (idx > 0) {
      var mk = generatePropertyKey(properyName),
        [
          sepalLength,
          sepalWidth,
          petalLength,
          petalWidth,
          species
        ] = el.split(',')

      var mv;
      switch (properyName) {
        case 'sepalLength':
          mv = sepalLength;
          break;
        case 'sepalWidth':
          mv = sepalWidth;
          break;
        case 'petalLength':
          mv = petalLength;
          break;
        case 'petalWidth':
          mv = petalWidth;
          break;
      }

      if (!accum[species] || (accum[species] && mv > accum[species][mk])) {
        accum[species] = {
          [mk]: mv,
          sepalLength,
          sepalWidth,
          petalLength,
          petalWidth
        };

        delete accum[species][properyName];
      }
    }

    return accum;
  }, {});

  return o;
}


//Demo code:
var data = parse(document.querySelector('#data').innerHTML);

var options = [
  'sepalLength',
  'sepalWidth',
  'petalLength',
  'petalWidth'
];

console.log(options.map(el => getMax(data, el)))
pre {
  display: none;
}
<pre id="data">
sepalLength,sepalWidth,petalLength,petalWidth,species
5.1,3.5,1.4,0.2,setosa
4.9,3,1.4,0.2,setosa
4.7,3.2,1.3,0.2,setosa
4.6,3.1,1.5,0.2,setosa
5,3.6,1.4,0.2,setosa
5.4,3.9,1.7,0.4,setosa
4.6,3.4,1.4,0.3,setosa
5,3.4,1.5,0.2,setosa
5.3,3.7,1.5,0.2,setosa
5,3.3,1.4,0.2,setosa
6.8,2.8,4.8,1.4,versicolor
6.7,3,5,1.7,versicolor
6,2.9,4.5,1.5,versicolor
5.7,2.6,3.5,1,versicolor
5.5,2.4,3.8,1.1,versicolor
5.5,2.4,3.7,1,versicolor
5.8,2.7,3.9,1.2,versicolor
6,2.7,5.1,1.6,versicolor
5.4,3,4.5,1.5,versicolor
6,3.4,4.5,1.6,versicolor
6.7,3.1,4.7,1.5,versicolor
6.3,2.3,4.4,1.3,versicolor
5.6,3,4.1,1.3,versicolor
5.5,2.5,4,1.3,versicolor
5.5,2.6,4.4,1.2,versicolor
6.1,3,4.6,1.4,versicolor
5.8,2.6,4,1.2,versicolor
5,2.3,3.3,1,versicolor
5.6,2.7,4.2,1.3,versicolor
5.7,3,4.2,1.2,versicolor
5.7,2.9,4.2,1.3,versicolor
6.2,2.9,4.3,1.3,versicolor
5.1,2.5,3,1.1,versicolor
5.7,2.8,4.1,1.3,versicolor
6.3,3.3,6,2.5,virginica
5.8,2.7,5.1,1.9,virginica
7.1,3,5.9,2.1,virginica
5.8,2.8,5.1,2.4,virginica
6.4,3.2,5.3,2.3,virginica
6.5,3,5.5,1.8,virginica
7.7,3.8,6.7,2.2,virginica
7.7,2.6,6.9,2.3,virginica
6,2.2,5,1.5,virginica
6.9,3.2,5.7,2.3,virginica
5.6,2.8,4.9,2,virginica
7.7,2.8,6.7,2,virginica
6.3,2.7,4.9,1.8,virginica
6.7,3.3,5.7,2.1,virginica
7.2,3.2,6,1.8,virginica
6.2,2.8,4.8,1.8,virginica
6.1,3,4.9,1.8,virginica
6.4,2.8,5.6,2.1,virginica
7.2,3,5.8,1.6,virginica
7.4,2.8,6.1,1.9,virginica
7.9,3.8,6.4,2,virginica
6.4,2.8,5.6,2.2,virginica
6.3,2.8,5.1,1.5,virginica
6.1,2.6,5.6,1.4,virginica
7.7,3,6.1,2.3,virginica
6.3,3.4,5.6,2.4,virginica
6.4,3.1,5.5,1.8,virginica
</pre>

0
ответ дан Tom O. 16 January 2019 в 20:15
поделиться

Вы можете найти объект, который имеет maxSepalLength в массиве leaves и добавить его к возвращенному объекту:

return { maxSepalLength , ...leaves.find(e => e.sepalLength === maxSepalLength) }

РЕДАКТИРОВАТЬ:

[ 1113] Вы можете уменьшить количество итераций, используя reduce вместо d3.max:

maxdata = d3.nest()
    .key(function (d) { return d.species; })
    .rollup(function (leaves) {
        return leaves.reduce((max, curr) => {      
        max['maxSepalLength'] = max['maxSepalLength'] || 0;

        if(max['maxSepalLength'] < curr.sepalLength)
            max = {...curr, maxSepalLength : curr.sepalLength};

        return max;
      }, {});      
    })
    .entries(irisdata)

var irisdata = d3.csvParse(d3.select("pre#data").text());
console.log({ irisdata })

irisdata.forEach(function (d) {
    d.sepalLength = +d.sepalLength;
});

maxdata = d3.nest()
    .key(function (d) { return d.species; })
    .rollup(function (leaves) {
    
        var maxSepalLength = d3.max(leaves, function (x) { return x.sepalLength })
     		return { maxSepalLength , ...leaves.find(e => e.sepalLength === maxSepalLength) }
    })
    .entries(irisdata)

console.log({maxdata})
pre {
  display:none;
  }
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<pre id="data">
sepalLength,sepalWidth,petalLength,petalWidth,species
5.1,3.5,1.4,0.2,setosa
4.9,3,1.4,0.2,setosa
4.7,3.2,1.3,0.2,setosa
4.6,3.1,1.5,0.2,setosa
5,3.6,1.4,0.2,setosa
5.4,3.9,1.7,0.4,setosa
4.6,3.4,1.4,0.3,setosa
5,3.4,1.5,0.2,setosa
5.3,3.7,1.5,0.2,setosa
5,3.3,1.4,0.2,setosa
6.8,2.8,4.8,1.4,versicolor
6.7,3,5,1.7,versicolor
6,2.9,4.5,1.5,versicolor
5.7,2.6,3.5,1,versicolor
5.5,2.4,3.8,1.1,versicolor
5.5,2.4,3.7,1,versicolor
5.8,2.7,3.9,1.2,versicolor
6,2.7,5.1,1.6,versicolor
5.4,3,4.5,1.5,versicolor
6,3.4,4.5,1.6,versicolor
6.7,3.1,4.7,1.5,versicolor
6.3,2.3,4.4,1.3,versicolor
5.6,3,4.1,1.3,versicolor
5.5,2.5,4,1.3,versicolor
5.5,2.6,4.4,1.2,versicolor
6.1,3,4.6,1.4,versicolor
5.8,2.6,4,1.2,versicolor
5,2.3,3.3,1,versicolor
5.6,2.7,4.2,1.3,versicolor
5.7,3,4.2,1.2,versicolor
5.7,2.9,4.2,1.3,versicolor
6.2,2.9,4.3,1.3,versicolor
5.1,2.5,3,1.1,versicolor
5.7,2.8,4.1,1.3,versicolor
6.3,3.3,6,2.5,virginica
5.8,2.7,5.1,1.9,virginica
7.1,3,5.9,2.1,virginica
5.8,2.8,5.1,2.4,virginica
6.4,3.2,5.3,2.3,virginica
6.5,3,5.5,1.8,virginica
7.7,3.8,6.7,2.2,virginica
7.7,2.6,6.9,2.3,virginica
6,2.2,5,1.5,virginica
6.9,3.2,5.7,2.3,virginica
5.6,2.8,4.9,2,virginica
7.7,2.8,6.7,2,virginica
6.3,2.7,4.9,1.8,virginica
6.7,3.3,5.7,2.1,virginica
7.2,3.2,6,1.8,virginica
6.2,2.8,4.8,1.8,virginica
6.1,3,4.9,1.8,virginica
6.4,2.8,5.6,2.1,virginica
7.2,3,5.8,1.6,virginica
7.4,2.8,6.1,1.9,virginica
7.9,3.8,6.4,2,virginica
6.4,2.8,5.6,2.2,virginica
6.3,2.8,5.1,1.5,virginica
6.1,2.6,5.6,1.4,virginica
7.7,3,6.1,2.3,virginica
6.3,3.4,5.6,2.4,virginica
6.4,3.1,5.5,1.8,virginica
</pre>

0
ответ дан Taki 16 January 2019 в 20:15
поделиться
Другие вопросы по тегам:

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