SQL:按日期对列进行排序/分组

时间:2020-04-07 10:37:25

标签: sql sql-server date grouping rank

使用SQL Server Management Studio v17.9.1

我试图按“站点”和“区域”按日期对某些数据进行排名/排序/分组,但我一直在努力使自己无法按字母顺序对区域进行排名,并按出现的最早日期对其进行排名。

这是我的数据:

version: '3.6'

services:
  client1:
    container_name: client1
    image: openjdk:8-alpine
    command: [sh, -c, "nslookup app-two.domain.com && sleep 100"]
    hostname: app-one.domain.com
    domainname: domain.com
    networks:
      dns-network:
        aliases:
          - app-one.domain.com

  client2:
    container_name: client2
    image: openjdk:8-alpine
    command: [sh, -c, "nslookup app-one.domain.com && sleep 100"]
    hostname: app-two.domain.com
    domainname: domain.com
    networks:
      dns-network:
        aliases:
          - app-two.domain.com

networks:
  dns-network:
  name: dns-network

我想添加2列,以按日期的升序对网站和区域进行排名/分组,如下所示:

client2    | Name:      app-one.domain.com
client2    | Address 1: 192.168.224.2 client1.dns-network
client1    | Name:      app-two.domain.com
client1    | Address 1: 192.168.224.3 client2.dns-network

很抱歉,如果我不清楚的话

2 个答案:

答案 0 :(得分:2)

您可以使用min()作为窗口函数来获取每个站点和站点/区域组合的最短日期。然后使用dense_rank()

select t.*,
       dense_rank() over (order by min_site_date, site) as site_seqnum,
       dense_rank() over (partition by site order by min_site_date) as area_seqnum
from (select t.*,
             min(date) over (partition by site) as min_site_date,
             min(date) over (partition by site, area) as min_site_area_date
      from t
     ) t

答案 1 :(得分:0)

您可以使用窗口功能:

select t.*, 
       dense_rank() over (order by site, site_date) as site_sequence,
       dense_rank() over (partition by site order by area, site_area_date) as area_sequence
from (select t.*,
            min([date]) over (partition by [site]) as site_date,
            min([date]) over (partition by [site], area) as site_area_date
      from table t
     ) t;
相关问题