Добавить число в строки на основе одинаковых значений в выбранных столбцах - PullRequest
3 голосов
/ 08 марта 2012

У меня есть база данных PostgreSQL, в которой содержатся билеты на трафик, написанные несколькими юрисдикциями.

В некоторых юрисдикциях не указывается, написано ли несколько билетов на одной остановке трафика.Однако это можно сделать, проанализировав другие области.Рассмотрим эти данные:

ticket_id  timestamp            drivers_license
----------------------------------------------
1          2008-08-07 01:51:00  11111111
2          2008-08-07 01:51:00  11111111
3          2008-08-07 02:02:00  22222222
4          2008-08-07 02:25:00  33333333
5          2008-08-07 04:23:00  44444444
6          2008-08-07 04:23:00  55555555
7          2008-08-07 04:23:00  44444444

Могу сделать вывод, что:

  • Билеты 1 и 2 были записаны в одной остановке трафика, поскольку они имеют общие номера водительских прав и метки времени.
  • То же самое для 5 и 7, но обратите внимание, как билет 6 между ними.Возможно, в это же время кто-то другой писал офицер, или операторы ввода данных вводили данные не по порядку.

Я хотел бы добавить еще один столбец с уникальным идентификатором для каждой остановки трафика.Он не будет первичным ключом для таблицы, поскольку он будет иметь повторяющиеся значения.Например:

ticket_id  timestamp            drivers_license  stop_id
--------------------------------------------------------
1          2008-08-07 01:51:00  11111111         1
2          2008-08-07 01:51:00  11111111         1
3          2008-08-07 02:02:00  22222222         2
4          2008-08-07 02:25:00  33333333         3
5          2008-08-07 04:23:00  44444444         4
6          2008-08-07 04:23:00  55555555         5
7          2008-08-07 04:23:00  44444444         4

Я могу подумать о вычислительно-жадных алгоритмических способах сделать это с помощью C #, но существует ли эффективный SQL-запрос, который может работать?

Ответы [ 4 ]

3 голосов
/ 08 марта 2012

Если вы используете оконную функцию rank(), это становится удивительно простым:

SELECT *
      ,rank() OVER (ORDER BY ts, drivers_license)
FROM   tbl
ORDER  BY ticket_id

Возвращает именно то, что вы просили.

Я переименовал ваш столбец timestamp в ts, потому что timestamp - это имя типа в PostgreSQL и зарезервированное слово в каждом стандарте SQL.

1 голос
/ 08 марта 2012

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

1 голос
/ 08 марта 2012

Эффективный SQL-запрос FTW!

Я не на компьютере, на котором я могу проверить это, так что, вероятно, есть некоторые проблемы с синтаксисом; Я исправлю утром, но это примерно так:

WITH uniquez as (SELECT timestamp, drivers_license, 
rank() over (ORDER BY timestamp, drivers_license) as counterz 
FROM ticketTable)

UPDATE ticketTable TT
SET stop_id = uniquez.counterz
WHERE uniquez.timestamp = TT.timestamp
AND uniquez.drivers_license = TT.drivers_license

По сути, вы делаете выбор, который групп (разделов) по timestamp и drivers_license и имеет счетчик строк, который идет вместе с ним. Когда вы делаете обновление, вы используете счетчик строк этой предыдущей таблицы выбора в качестве «stop_id» и обновляете столбцы, которые соответствуют отметке времени и лицензии водителя.

0 голосов
/ 08 марта 2012
SELECT ticket_id,timestamp,drivers_license,substr(drivers_license,1,1) as stop_id
FROM traffic_data;

Надеюсь, это работает для тебя ...:)

...