Как взять наименьшее свидание из группы? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть набор данных, который выглядит так:

|id |статус |open_date |имя |
|8 |активный |2019-3-2 |блаб |
|8 |активный |2019-3-8 |blub |
|8 |неактивный |2019-3-9 |Ханс |
|8 |активный |2019-3-10 |Ана |
|9 |активный |2019-3-4 |Марс |

Я хочу добиться следующего:

|id |статус |open_date |имя |status_change_date |
|8 |активный |2019-3-2 |болтун |2019-3-2
|8 |активный |2019-3-8 |клуб |2019-3-2
|8 |неактивный |2019-3-9 |Ганс |2019-3-9
|8 |активный |2019-3-10 |Ана |2019-3-10
|9 |активный |2019-3-4 |Марс |2019-3-4

для каждого идентификатора, который я хотел бы рассчитать, когда статус в последний раз изменился

Я уже пробовал с groupBy, но проблема в том, что я хочу группировать только строки с Activeи неактивные, которые находятся рядом друг с другом. Если между ACTIVE есть НЕАКТИВНО, я бы хотел создать новую группу для нового ACTIVE.

У кого-нибудь есть идея, чтобы решить эту проблему?

Ответы [ 3 ]

1 голос
/ 30 сентября 2019

Вот чистое решение SQL, использующее оконные функции. Это работает путем создания раздела, который содержит последовательные записи с одинаковыми идентификатором и состоянием.

SELECT
    id,
    status,
    open_date,
    name,
    MIN(open_date) OVER(PARTITION BY id, rn1 - rn2 ORDER BY open_date) status_change_date
FROM (
    SELECT 
        t.*, 
        ROW_NUMBER() OVER(PARTITION BY id ORDER BY open_date) rn1,
        ROW_NUMBER() OVER(PARTITION BY id, status ORDER BY open_date) rn2
    FROM mytable t
) x
ORDER BY id, open_date

Демонстрация на БД Fiddle :

| id  | status   | open_date  | name | status_change_date |
| --- | -------- | ---------- | ---- | ------------------ |
| 8   | active   | 2019-03-02 | blab | 2019-03-02         |
| 8   | active   | 2019-03-08 | blub | 2019-03-02         |
| 8   | inactive | 2019-03-09 | hans | 2019-03-09         |
| 8   | active   | 2019-03-10 | ana  | 2019-03-10         |
| 9   | active   | 2019-03-04 | mars | 2019-03-04         |
0 голосов
/ 30 сентября 2019

То есть ответ о том, как взять наименьшую дату из группы?

let minDate = new Date('0001-01-01T00:00:00Z');

dataset.forEach(x => if( x.date > this.minDate) { this.minDate = x.date } ) 

console.log(this.minDate);
0 голосов
/ 30 сентября 2019

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

var movies = [
    {title: 'The Godfather', rating: 9.2, release: '24 March 1972'},
    {title: 'The Godfather: Part II', rating: 9.0, release: '20 December 1972'},
    {title: 'The Shawshank Redemption', rating: 9.3, release: '14 October 1994'},
];

movies.sort(function(a, b) {
    var dateA = new Date(a.release), dateB = new Date(b.release);
    return dateA - dateB;
});

Эта сортировка работает, потому что js позволяет сравнивать арифметику с объектами даты, которые сначала автоматически преобразуются в числовые представления.


В SQLиспользовать функцию MIN:

Идентификатор ORDER OrderDate OrderNumber CustomerId TotalAmount

SELECT MIN (OrderDate) FROM [Order] WHERE YEAR (OrderDate) = 2013

...