如何添加计算不同人的任何城市的列

时间:2016-12-22 11:28:01

标签: sql-server tsql

我有这样的表:

let rightView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 40))

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 60, height: 40))
label.text = "Text"
label.textColor = UIColor.red
label.textAlignment = .center

let imageView = UIImageView(frame: CGRect(x: 40, y: 0, width: 40, height: 40))
imageView.image = UIImage(named: "selectdrop")
rightView.addSubview(label)
rightView.addSubview(imageView)

txtField.rightView = rightView
txtField.rightViewMode = .always

我想要一个列在城市内的不同人物的专栏:

Person    City    workingdate
A    Newyork    10.11.2015
A    Newyork    11.11.2015
A    Newyork    12.11.2015
B    Newyork    10.11.2015
B    Newyork    15.11.2015
B    Newyork    16.11.2015
B    Newyork    18.11.2015

你能帮我解决一下这个问题吗?

Person    City    workingdate  countdistinctpersonincity
A    Newyork    10.11.2015             1
A    Newyork    11.11.2015             0
A    Newyork    12.11.2015             0
B    Newyork    10.11.2015             1
B    Newyork    15.11.2015             0
B    Newyork    16.11.2015             0
B    Newyork    18.11.2015             0

3 个答案:

答案 0 :(得分:4)

一个变种:

SELECT *
      ,IIF(ROW_NUMBER() OVER(PARTITION BY City, Person ORDER BY workingdate) = 1, 1, 0)
FROM Persons

enter image description here

对于2012之前的SQL Server,您可以使用:

SELECT P.*
      ,CASE WHEN DS.[City] IS NULL THEN 0 ELSE 1 END
FROM Persons P
LEFT JOIN 
(
    SELECT City
          ,Person
          ,MIN(workingdate) AS workingdate
    FROM Persons
    GROUP BY City
            ,Person
) DS
    ON P.City = DS.[City]
    AND P.[Person] = DS.[Person]
    AND P.[workingdate] = DS.[workingdate]

答案 1 :(得分:2)

我相信这个查询会给你的结果。想法是检查按人和日期排序的先前条目是否不同,这意味着我们达到了新人:

select case 
         when Person != lag(Person, 1, 'XXXXXX') over (order by Person, workingdate) then 1 
         else 0 
       end 
  from table;

要了解这是如何工作的一个例子:

CREATE TABLE #Persons (
  Person varchar(25),
  City varchar(255),
  workingdate varchar(10)
)

insert into #Persons
values ('A', 'Newyork','10.11.2015'),
       ('A', 'Newyork','11.11.2015'),
       ('A', 'Newyork','12.11.2015'),
       ('B', 'Newyork','10.11.2015'),
       ('B', 'Newyork','15.11.2015'),
       ('B', 'Newyork','16.11.2015'),
       ('B', 'Newyork','18.11.2015')

select p.Person, p.City, p.workingdate,
       case 
         when p.Person != lag(p.Person, 1, 'XXXXXX') over (order by    p.Person, p.workingdate) then 1 
         else 0 
       end 
from   #Persons p

结果是:

Person  City      workingdate   COLUMN1 
A       Newyork   10.11.2015    1   
A       Newyork   11.11.2015    0   
A       Newyork   12.11.2015    0   
B       Newyork   10.11.2015    1   
B       Newyork   15.11.2015    0   
B       Newyork   16.11.2015    0   
B       Newyork   18.11.2015    0   

答案 2 :(得分:2)

SELECT p.*, p2.*
FROM #Persons p
    CROSS APPLY 
        (SELECT COUNT (DISTINCT p1.Person) as countdistinctpersonincity
        FROM
            #Persons p1 
        WHERE
            p1.Person <> p.Person
            AND p1.City = p.City
            AND p1.workingdate = p.workingdate) p2;

测试代码

CREATE TABLE #Persons
(Person varchar(25),
City varchar(255),
workingdate varchar(10))
insert into #Persons
values ('A', 'Newyork','10.11.2015'),
('A', 'Newyork','11.11.2015'),
('A', 'Newyork','12.11.2015'),
('B', 'Newyork','10.11.2015'),
('B', 'Newyork','15.11.2015'),
('B', 'Newyork','16.11.2015'),
('B', 'Newyork','18.11.2015');

SELECT p.*, p2.*
FROM #Persons p
    CROSS APPLY 
        (SELECT COUNT (DISTINCT p1.Person) as countdistinctpersonincity
        FROM
            #Persons p1 
        WHERE
            p1.Person <> p.Person
            AND p1.City = p.City
            AND p1.workingdate = p.workingdate) p2;

DROP TABLE #Persons;

结果如下:

Person  City      workingdate   countdistinctpersonincity   
A       Newyork   10.11.2015    1   
A       Newyork   11.11.2015    0   
A       Newyork   12.11.2015    0   
B       Newyork   10.11.2015    1   
B       Newyork   15.11.2015    0   
B       Newyork   16.11.2015    0   
B       Newyork   18.11.2015    0