如何获取一组中最小的日期?
How to take the smallest date of a group?
我有一个看起来像这样的数据集:
|编号 |状态 | open_date |姓名 |
| 8 |活跃| 2019-3-2 |废话 |
| 8 |活跃| 2019-3-8 |俱乐部 |
| 8 |不活跃 | 2019-3-9 |汉斯 |
| 8 |活跃| 2019-3-10 |安娜 |
| 9 |活跃| 2019-3-4 |火星 |
我想实现以下目标:
|编号 |状态 | 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 和 Inactive 行进行分组。如果在 ACTIVE 之间有一个 INACTIVE,我喜欢为新的 ACTIVE 创建一个新组。
有人有解决办法吗?
你可以试试这个:
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;
});
这个 sortby 之所以有效,是因为 js 允许您比较日期对象的算术,这些对象首先自动转换为数字表示。
在SQL中使用MIN函数:
订购
ID
订购日期
订单号
顾客ID
总金额
SELECT 最小值(订单日期)
来自[订单]
其中年份(订单日期)= 2013
这就是如何取组中最小日期的答案?
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);
这是一个使用 window 函数的纯 SQL 解决方案。这通过生成一个包含具有相同 ID 和状态的连续记录的分区来实现。
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
| 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 |
我有一个看起来像这样的数据集:
|编号 |状态 | open_date |姓名 |
| 8 |活跃| 2019-3-2 |废话 |
| 8 |活跃| 2019-3-8 |俱乐部 |
| 8 |不活跃 | 2019-3-9 |汉斯 |
| 8 |活跃| 2019-3-10 |安娜 |
| 9 |活跃| 2019-3-4 |火星 |
我想实现以下目标:
|编号 |状态 | 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 和 Inactive 行进行分组。如果在 ACTIVE 之间有一个 INACTIVE,我喜欢为新的 ACTIVE 创建一个新组。
有人有解决办法吗?
你可以试试这个:
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;
});
这个 sortby 之所以有效,是因为 js 允许您比较日期对象的算术,这些对象首先自动转换为数字表示。
在SQL中使用MIN函数:
订购 ID 订购日期 订单号 顾客ID 总金额
SELECT 最小值(订单日期) 来自[订单] 其中年份(订单日期)= 2013
这就是如何取组中最小日期的答案?
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);
这是一个使用 window 函数的纯 SQL 解决方案。这通过生成一个包含具有相同 ID 和状态的连续记录的分区来实现。
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
| 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 |