繁体   English   中英

按日期和活动顺序分区

[英]Partition by with order by Date and Active

我有一张桌子:

| Title    | Expire_date | Active |
| -------- | --------    |--------|
| Apple    | 01-01-2023  |1       |
| Banana   | 01-01-2022  |1       |
| Orange   | 01-06-2021  |1       |
| Banana   | 01-01-2021  |0       |
| Apple    | 01-01-2021  |0       |
| Apple    | 01-01-2020  |0       |
| ...      | ...         |...     |
| Fruit_999| 01-01-2020  |1       |

并希望获得结果形式选择如下所示:

标题 到期日期 积极的
水果_999 01-01-2020 1个
橙子 01-06-2021 1个
香蕉 01-01-2022 1个
香蕉 01-01-2021 0
苹果 01-01-2023 1个
苹果 01-01-2021 0
苹果 01-01-2020 0
... ... ...

因此,首先它应该按活动顺序排序,然后按过期日期排序,然后按标题对结果进行分组。

1)在这里不起作用,它不会按标题分组。

ORDER BY expire_date, active

2) 将Apple 放在最前面,虽然Orange 和Fruit_999 日期较少,但这是错误的

SELECT * FROM `table` ORDER BY MIN(`expire_date`) OVER (PARTITION BY `title`), `active` DESC;

试试这个。 查询将按第一列对行进行排序,然后在不破坏第一条规则的情况下按第二列进行排序。 然后,以同样的方式,在不违反现有规则的情况下,根据第三等。

SELECT * FROM `events` ORDER BY Title DESC, Expire_date ASC

您应该使用分析函数 (oracle) 或窗口函数 (MSSQL)... 来实现您的预期结果。

因为您没有标记您的 RDBMS,所以这是对 Oracle 的运行查询。 转换它以适合您的 RDBMS。

WITH table_name AS 
(
    SELECT  'Apple' AS Title, TO_DATE('01-01-2023', 'DD-MM-YYYY') AS expire_date,  1 AS active FROM dual UNION ALL      
    SELECT  'Banana' AS Title, TO_DATE('01-01-2022', 'DD-MM-YYYY') AS expire_date,  1 AS active FROM dual UNION ALL      
    SELECT  'Orange' AS Title, TO_DATE('01-06-2021', 'DD-MM-YYYY') AS expire_date,  1 AS active FROM dual UNION ALL      
    SELECT  'Banana' AS Title, TO_DATE('01-01-2021', 'DD-MM-YYYY') AS expire_date,  0 AS active FROM dual UNION ALL      
    SELECT  'Apple' AS Title, TO_DATE('01-01-2021', 'DD-MM-YYYY') AS expire_date,  0 AS active FROM dual UNION ALL      
    SELECT  'Apple' AS Title, TO_DATE('01-01-2020', 'DD-MM-YYYY') AS expire_date,  0 AS active FROM dual UNION ALL      
    SELECT  'Fruit_999' AS Title, TO_DATE('01-01-2020', 'DD-MM-YYYY') AS expire_date,  1 AS active FROM dual 
),
title_active AS
(
    SELECT Title, 
        MIN(CASE WHEN active = 1 THEN expire_date ELSE TO_DATE('01-01-3000', 'DD-MM-YYYY') END) AS min_active_expire_date, 
        MAX(active) AS max_active
    FROM table_name
    GROUP BY title
),
title_ordered AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY max_active DESC, min_active_expire_date) AS rn,
        t.*
    FROM title_active t
)
SELECT t.title, t.expire_date, t.active--*
FROM table_name t
INNER JOIN title_ordered ti
ON t.title = ti.title
ORDER BY ti.rn, t.active DESC, t.expire_date;

使用sqlfiddle测试

P/S:这个查询应该可以工作大约 978 年。 在那之后,如果你继续运行,这个查询可能会返回错误的结果......

尝试以下操作:

select * from table_name
order by max(Expire_date) over (partition by Title),
         Title, Active desc, Expire_date

这将根据每个标题的最新 Expire_date 对行进行排序,日期最早的标题首先出现。 如果有两个具有相同 max(Expire_date) 的标题,则按标题排序以保持标题连续(成组)。 对于相同标题(相同最大日期)内的行,按活动降序排序以首先显示每个标题的活动行。

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM