Как правильно запросить таблицу данных в PowerShell - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь использовать OleDB с помощью Text Driver в PowerShell для более простого управления большим CSV.

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

Пример:

  • Первый запрос: я запрашиваю таблицу, чтобы получить счетчик для столбца 1, который производит 100.
  • Второй запрос: я запрашиваю таблицу, чтобы указать число в другом столбце, и получаю те же 100 из первого запроса.

Трудно понять, как очистить данные из первого запроса, чтобы возвращались новые результаты.

$conn = New-Object System.Data.OleDb.OleDbconnection
$conn.ConnectionString = $connstring
$conn.Open()
$cmd = New-Object System.Data.OleDB.OleDBCommand
$cmd.Connection = $conn

$checkColumns = "Name, Age"

$data_group_check = "SELECT $checkColumns, COUNT(*) as DupeCount FROM [$tablename]  GROUP BY $checkColumns HAVING COUNT(*) > 1"
$data_online_check =  "SELECT $checkColumns, COUNT(*) as DupeCount FROM [$tablename] WHERE Online LIKE 'yes' GROUP BY $checkColumns HAVING COUNT(*) > 1"
$data_offline_check = "SELECT $checkColumns, COUNT(*) as DupeCount FROM [$tablename] WHERE Online LIKE 'no' GROUP BY $checkColumns HAVING COUNT(*) > 1"


$dt = New-Object System.Data.DataTable
$cmd.CommandText = $data_group_check
$dt.BeginLoadData()

# First Query
$dt.Load($cmd.ExecuteReader([System.Data.CommandBehavior]::Default))
$dupecount = $dt.Rows.Count

# Start Second Query
$cmd.CommandText = $data_online_check
$dt.Load($cmd.ExecuteReader([System.Data.CommandBehavior]::Default))
$online_dupes = $dt.Rows.Count

# Start Third Query
$cmd.CommandText = $data_offline_check
$dt.Load($cmd.ExecuteReader([System.Data.CommandBehavior]::CloseConnection))
$offline_dupes = $dt.Rows.Count
$dt.EndLoadData()
$totaltime = [math]::Round($elapsed.Elapsed.TotalSeconds,2)

# Get Total Row Count
$conn.Open()
$cmd.CommandText = "SELECT COUNT(*) as TotalRows FROM [$tablename]"
$totalrows = $cmd.ExecuteScalar()
$conn.Close()


  $totalrows 
  $dupecount
  $online_dupes
  $offline_dupes
  $totaltime

  • $ totalrows - Производит 1500000
  • $ dupecount - Производит 15000
  • $ online_dupes - Производит 15000 (должно быть 2002)
  • $ offline_dupes - производит 15000 (должно быть 3040)

Если я запускаю каждый запрос отдельно, я получаю правильные числа.

Между первым и вторым / третьим запросом есть что-то, что мне нужно очистить?

1 Ответ

0 голосов
/ 02 февраля 2020

Вы можете сделать это только с одним запросом, подобным этому:

SELECT $checkColumns, 
sum(case when Online = 'yes' then 1 else 0 end) NbYes,
sum(case when Online = 'no' then 1 else 0 end) NbNo,
COUNT(*) as DupeCount 
FROM [$tablename]  
GROUP BY $checkColumns 
HAVING COUNT(*) > 1 
or sum(case when Online = 'yes' then 1 else 0 end)>1
or sum(case when Online = 'no' then 1 else 0 end)>1

или вот так:

SELECT 'DUPLICATE 1' TypeDuplicate, $checkColumns, COUNT(*) as DupeCount 
FROM [$tablename]  
GROUP BY $checkColumns 
HAVING COUNT(*) > 1

UNION ALL
SELECT 'DUPLICATE 2' TypeDuplicate, $checkColumns, COUNT(*) as DupeCount 
FROM [$tablename] 
WHERE Online = 'yes' 
GROUP BY $checkColumns 
HAVING COUNT(*) > 1

UNION ALL
SELECT 'DUPLICATE 3' TypeDuplicate, $checkColumns, COUNT(*) as DupeCount 
FROM [$tablename] 
WHERE Online = 'no' 
GROUP BY $checkColumns 
HAVING COUNT(*) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...