SQL如何通过另一个订单排序并保持扩展行?

时间:2016-12-19 12:02:37

标签: sql sql-server

我的结果表是:

  FDate       FTime      FNo   FId FRID FRCont
2016-12-19  07:25:00    1254    A1  A1   1
2016-12-19  08:45:00    1322    A2  A1   2
2016-12-19  13:20:00    4521    B1  B1   1
2016-12-19  16:40:00    7841    B2  B1   2
2016-12-19  20:45:00    1258    B3  B1   3
2016-12-19  11:25:00    3254    C1  C1   1
2016-12-19  13:10:00    3145    C2  C1   2
2016-12-19  15:20:00    3333    C3  C1   3
2016-12-20  07:35:00    7777    C4  C1   4
2016-12-20  08:50:00    7851    D1  D1   1
2016-12-20  10:30:00    45123   D2  D1   2

我希望按日期和时间排序(FCont = 1行) 但我不希望在FRID和FRCont列中按值更改关系。 看起来像这样:

   FDate     FTime      FNo    FId FRID FRCont
2016-12-19  07:25:00    1254    A1  A1   1
2016-12-19  08:45:00    1322    A2  A1   2
2016-12-19  11:25:00    3254    C1  C1   1
2016-12-19  13:10:00    3145    C2  C1   2
2016-12-19  15:20:00    3333    C3  C1   3
2016-12-20  07:35:00    7777    C4  C1   4
2016-12-19  13:20:00    4521    B1  B1   1
2016-12-19  16:40:00    7841    B2  B1   2
2016-12-19  20:45:00    1258    B3  B1   3
2016-12-20  08:50:00    7851    D1  D1   1
2016-12-20  10:30:00    45123   D2  D1   2

请在sql server查询中以任何方式解决。 非常感谢。

3 个答案:

答案 0 :(得分:2)

我认为你正在寻找这样的东西:

SELECT FDate, FTime, FNo, FId, FRID, FRCont
FROM (
   SELECT FDate, FTime, FNo, FId, FRID, FRCont,
          MIN(FDate) OVER (PARTITION BY FRID) AS Min_Date,
          MIN(FTime) OVER (PARTITION BY FRID) AS Min_Time
   FROM mytable ) AS t
ORDER BY Min_Date, Min_Time, FRID, FDate, FTime

情侣(Min_Date, Min_Time)为每个FRID切片提供起始日期时间值。使用这对,我们可以对每个切片进行排序,首先放置具有最低日期时间值的切片,然后是具有下一个日期时间值的切片,等等。

答案 1 :(得分:0)

请试试这个:

select FDate,FTime, FNo,FId,FRID,FRCont from (
    select t.*
        ,min(fdate+ftime) over (partition by frid) mn
    from t) t
order by mn, frcont;

答案 2 :(得分:0)

您似乎希望按每个组的最短日期/时间排序:

select t.*
from t
order by min(date + time) over (partition by frid),
         frid,
         fid;

注意:您可能需要将日期/时间转换为datetime才能使添加工作。