Pl sql ... найти номер вхождения - PullRequest
0 голосов
/ 18 апреля 2011

Предположим, у меня есть 2-я запись с датой

table1 с 2-мя наборами записей

key1 startdate1  startdate2 startdate3
100  2349         2456       2345
100  3456         3878       2872

Дата в двоичном формате.Мне нужно получить счетчик изменения даты, который означает, сколько раз дата изменилась после одной конкретной даты, то есть, предположим, после 14 апреля 2011 года, сколько раз дата изменилась (для этих двух записей по отношению к конкретному key_1)

Уточнение

Предположим, у меня есть три записи:

+------+-------------+-------------+-------------+
| key1 | start_date1 | start_date2 | start_date3 |
+------+-------------+-------------+-------------+
| 701  | 08-SEP-2009 | 08-DEC-2009 | 08-jan-2010 |
| 701  | 08-JUN-2013 | 08-SEP-2013 | 08-DEC-2013 |
| 701  | 08-MAR-2017 | 08-MAR-2018 | 31-DEC-1899 |
+------+-------------+-------------+-------------+

Мне нужно посчитать количество измененных дат больше 14 апреля 2011 годаНапример, для ключа 701 есть 5 измененных дат, превышающих 14 апреля 2011 года.Мне нужно получить вывод таблицы с двумя полями:

+------+---------------+
| Key1 | changedcount  |
+------+---------------+
| 701  | 5             |
+------+---------------+

Ответы [ 3 ]

1 голос
/ 18 апреля 2011

Попробуйте нормализовать ваш стол:

WITH
  normalized_data AS
  (
    SELECT key1, start_date1 AS start_date FROM MYTABLE
  UNION ALL
    SELECT key1, start_date2 AS start_date FROM MYTABLE
  UNION ALL
    SELECT key1, start_date3 AS start_date FROM MYTABLE
  )

SELECT
  key1,
  COUNT(DISTINCT start_date) AS changedcount
FROM
  normalized_data
WHERE
  start_date > your_start_date_here
GROUP BY
  key1
0 голосов
/ 18 апреля 2011

Вы можете попробовать это:

select sum(d1)+sum(d2)+sum(d3) , key
 from
(
select
  t.key,
  (select count(*) from test t1 where t1.key = t.key and start_date1>to_date('14-Apr-2011','DD-mon-yyyy')) d1,
  (select count(*) from test t2 where t2.key = t.key  and start_date2>to_date('14-Apr-2011','DD-mon-yyyy')) d2,
  (select count(*) from test t3 where t3.key = t.key  and start_date3>to_date('14-Apr-2011','DD-mon-yyyy')) d3
from  test t
group by key
)
group by key

Вы также можете попробовать функцию ORACLE PIVOT (), если вы используете 11g или выше. У меня не установлено 11g в данный момент, но если вам нужен пример, я могу дать вам один с этой функцией.

С уважением, Alex

0 голосов
/ 18 апреля 2011

Теперь, когда вы задали более ясный вопрос:

select key1, count(distinct start_date)
from (
    select key1, start_date1 as start_date from myTable
    UNION ALL
    select key1, start_date2 as start_date from myTable
    UNION ALL
    select key1, start_date3 as start_date from myTable
) normalFormTable N
where start_date > myGivenDate
group by key
...