2

この要件のSQLを作成するためのヘルプが必要です-テーブルにデータがあります:

Empid      Date         Deptid  Location
-----------------------------------------
001    1st Jan 2012    101      BC
002    4th Jan 2012    101      AB
003    6th Jan 2012    103      PQ
004    8th Jan 2012    104      AB
005    10th jan 2012   105      XY

dateここで、場所がABで、dept値が異なる前の行(フィールドによって異なります)をフェッチします。上記の例では、次の行をフェッチする必要があります

003    6th Jan 2012    103      PQ

助言がありますか?

4

5 に答える 5

1
SELECT * FROM `YOUR_TABLE`
WHERE `id` < (SELECT `id` FROM `YOUR_TABLE`
              WHERE `location` =  'AB'
              AND `deptid` =  '104') 
ORDER BY id DESC LIMIT 1

これはあなたを助けるかもしれません:D

于 2012-09-26T04:55:48.377 に答える
1

SQL Server 2005 以降を想定

SELECT * FROM(
SELECT *

FROM(SELECT *,Row_Number() OVER(Order By [Date]) From <Your table>)X

WHERE X.[Date] = '8th Jan 2012' AND Location = 'AB')X WHERE Rn = Rn-1
于 2012-09-26T04:42:56.603 に答える
1
create table tblTest (
  Empid char(3)
  ,Date date
  ,Deptid char(3)
  ,Location char(2)
);

insert into tblTest (Empid,Date,Deptid,Location) values ("001","2012/01/01","101","BC");
insert into tblTest (Empid,Date,Deptid,Location) values ("002","2012/01/04","101","AB");
insert into tblTest (Empid,Date,Deptid,Location) values ("003","2012/01/06","103","PQ");
insert into tblTest (Empid,Date,Deptid,Location) values ("004","2012/01/08","104","AB");
insert into tblTest (Empid,Date,Deptid,Location) values ("005","2012/01/10","105","XY");

SELECT
  t2.*
FROM
  tblTest t1
  LEFT JOIN tblTest t2 ON t1.Date<t2.date
                          AND
                          t1.Deptid <> t2.Deptid
WHERE
  t1.Empid = "002"
ORDER BY
  t2.Date
LIMIT 1;

SQL Fiddleでテストできます

于 2012-09-26T06:11:05.643 に答える
0

このパターンを使用します。実際、私は条件を台無しにしていると思いますLastAB.DeptID!=Emp.DeptID。サブクエリは、開始したい特異なレコードを提供します。次に、外側のクエリは、別の場所 (または DeptID または設定した条件) で前の日付のレコードを検索し、ORDER BY + LIMIT 1 を使用して単一のレコードを特定します。

select Emp.*
from Emp
join (
  select *
  from Emp
  where Location = 'AB'
  order by Date desc
  limit 1) LastAB on LastAB.Date>Emp.Date
                 and LastAB.Location!=Emp.Location
order by Emp.Date desc
limit 1;

以下に複製された作業中のSQL Fiddle

create table Emp (
  Empid char(3),
  Date datetime,
  Deptid int,
  Location char(2)
  );
insert Emp values
('001', '2012-01-01', 101, 'BC'),
('002', '2012-01-04', 101, 'AB'),
('003', '2012-01-06', 103, 'PQ'),
('004', '2012-01-08', 104, 'AB'),
('005', '2012-01-10', 105, 'XY');

--- result

EMPID   DATE    DEPTID  LOCATION
003     January, 06 2012   103  PQ
于 2012-09-26T05:07:27.867 に答える
0
select * from table_name where Date < (select Date from table_name where Location="AB") and Deptid NOT IN( select Deptid from table_name where Location="AB") order by Date desc limit 1 ;

場所が「AB」である場合、日付フィールドに基づいて前の行を返し、従業員が同じ部門に属していないことも確認します

于 2012-09-26T05:31:42.527 に答える