Как устранить пользовательские повторяющиеся строки, возвращаемые в запросе SQL? - PullRequest
0 голосов
/ 04 марта 2020

В моей базе данных DB2 у меня есть некоторая информация о местах. Я написал запрос для таблицы DB2 под названием TABLEONE, чтобы вернуть некоторые элементы, которые мне нужны для отчета:

SELECT LOCATION, TIMESTAMP, LASTNAME, CUSTOMER_ID, REASON, Info1, Info2, Info3 FROM TABLEONE

Было возвращено шесть уникальных строк:

 +------------+----------------------------+----------+-------------+------------+-------+--------------+-------+
| LOCATION   | TIMESTAMP                  | LASTNAME | CUSTOMER_ID | REASON     | Info1 | Info2        | Info3 |
+------------+----------------------------+----------+-------------+------------+-------+--------------+-------+
| FrontDoor  | 2020-02-18 14:00:00.000000 | Smith    | 122         | Dropoff    | 1     | Apple        | Dog   |
+------------+----------------------------+----------+-------------+------------+-------+--------------+-------+
| FrontDoor  | 2020-02-19 11:00:00.000000 | Smith    | 122         | Dropoff    | 3     | Pear         | Cat   |
+------------+----------------------------+----------+-------------+------------+-------+--------------+-------+
| Kitchen    | 2020-02-19 17:00:00.000000 | Smith    | 122         | Eat        | 3     | Grapes       | Cat   |
+------------+----------------------------+----------+-------------+------------+-------+--------------+-------+
| Bathroom   | 2020-02-19 19:00:00.000000 | Smith    | 122         | Bio        | 2     | Pear         | Cat   |
+------------+----------------------------+----------+-------------+------------+-------+--------------+-------+
| FrontDoor  | 2020-02-19 11:00:00.000000 | Jones    | 123         | Dropoff    | 1     | Tomato       | Dog   |
+------------+----------------------------+----------+-------------+------------+-------+--------------+-------+
| LivingRoom | 2020-02-19 12:00:00.000000 | Jones    | 123         | Television | 3     | Dragon Fruit | Pear  |
+------------+----------------------------+----------+-------------+------------+-------+--------------+-------+

Мне нужно LOCATION , LASTNAME, CUSTOMER_ID и REASON, чтобы установить sh уникальную строку и должны возвращать только одну строку с наибольшей отметкой времени. Мне также нужны все остальные строки: Info1, Info2 и Info3, возвращаемые в операторе SELECT.

Другими словами, как переписать запрос для получения этого результата?:

 +------------+----------------------------+----------+-------------+------------+-------+--------------+-------+
| LOCATION   | TIMESTAMP                  | LASTNAME | CUSTOMER_ID | REASON     | Info1 | Info2        | Info3 |
+------------+----------------------------+----------+-------------+------------+-------+--------------+-------+
| FrontDoor  | 2020-02-19 13:00:00.000000 | Smith    | 122         | Dropoff    | 1     | Apple         | Dog   |
+------------+----------------------------+----------+-------------+------------+-------+--------------+-------+
| Kitchen    | 2020-02-19 17:00:00.000000 | Smith    | 122         | Eat        | 3     | Grapes       | Cat   |
+------------+----------------------------+----------+-------------+------------+-------+--------------+-------+
| Bathroom   | 2020-02-19 19:00:00.000000 | Smith    | 122         | Bio        | 2     | Pear         | Cat   |
+------------+----------------------------+----------+-------------+------------+-------+--------------+-------+
| FrontDoor  | 2020-02-19 11:00:00.000000 | Jones    | 123         | Dropoff    | 1     | Tomato       | Dog   |
+------------+----------------------------+----------+-------------+------------+-------+--------------+-------+
| LivingRoom | 2020-02-19 12:00:00.000000 | Jones    | 123         | Television | 3     | Dragon Fruit | Pear  |
+------------+----------------------------+----------+-------------+------------+-------+--------------+-------+

Спасибо Мэтт

Ответы [ 2 ]

2 голосов
/ 04 марта 2020

Попробуйте это:

/*
WITH TABLEONE (LOCATION, TIMESTAMP, LASTNAME, CUSTOMER_ID, REASON, Info1, Info2, Info3) AS 
(
VALUES
  ('FrontDoor  ', '2020-02-18 14:00:00.000000', 'Smith', 122, 'Dropoff    ', 1, 'Apple        ', 'Dog ')
, ('FrontDoor  ', '2020-02-19 11:00:00.000000', 'Smith', 122, 'Dropoff    ', 3, 'Pear         ', 'Cat ')
, ('Kitchen    ', '2020-02-19 17:00:00.000000', 'Smith', 122, 'Eat        ', 3, 'Grapes       ', 'Cat ')
, ('Bathroom   ', '2020-02-19 19:00:00.000000', 'Smith', 122, 'Bio        ', 2, 'Pear         ', 'Cat ')
, ('FrontDoor  ', '2020-02-19 11:00:00.000000', 'Jones', 123, 'Dropoff    ', 1, 'Tomato       ', 'Dog ')
, ('LivingRoom ', '2020-02-19 12:00:00.000000', 'Jones', 123, 'Television ', 3, 'Dragon Fruit ', 'Pear')
)
*/
SELECT A.LOCATION, A.TIMESTAMP, A.LASTNAME, A.CUSTOMER_ID, A.REASON, A.Info1
—-, A.Info2
, A.Info3
FROM
(
SELECT T.*, ROWNUMBER() OVER(PARTITION BY LOCATION, LASTNAME, CUSTOMER_ID, REASON ORDER BY TIMESTAMP DESC) RN_  
FROM TABLEONE T
) A
—- JOIN MYTAB B ON ...
WHERE A.RN_=1;
0 голосов
/ 04 марта 2020

Использование lag():

select timestamp, location, lastname, customerid, reason
from (select t.*,
             lag(timestamp) over (partition by location, lastname, customerid, reason) as prev_timestamp_llcr
      from t
     ) t
where date(prev_timestamp_llcr) <> date(timestamp) or
      prev_timestamp_llcr is null;

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

Если вы хотите вести только одну запись в день, вы можете использовать агрегацию:

select min(timestamp) as timestamp, location, lastname, customerid, reason
from t
group by date(prev_timestamp_llcr), location, lastname, customerid, reason
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...